Об’єднання аргументів bash в єдиний рядок з пробілами


40

Я намагаюся приєднати всі аргументи до функції Bash в одну єдину рядок з пробілами, що розділяють кожен аргумент. Мені також потрібно, щоб рядок включав поодинокі лапки навколо цілого рядка.

Ось що я маю досі ...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

Очевидно, це не працює, але мені цікаво, чи є спосіб досягти цього?

Відповіді:


57

Я вважаю, що це робить те, що ти хочеш. Він розмістить усі аргументи в одну рядок, розділений пробілами, з одинарними цитатами навколо всіх:

str="'$*'"

$*створює всі аргументи сценаріїв, розділені першим символом, $IFSякий за замовчуванням є пробілом.

Всередині подвійного котируваного рядка не потрібно уникати одинарних лапок.

Приклад

Давайте помістимо вище у файл сценарію:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

Тепер запустіть скрипт із зразками аргументів:

$ sh script.sh one two three four 5
'one two three four 5'

Цей сценарій є POSIX. Він буде працювати з, bashале це не вимагає bash.

Варіація: поєднання з косою рисою замість пробілів

Ми можемо перейти від пробілів до іншого символу, налаштувавши IFS:

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

Наприклад:

$ sh script.sh one two three four       
'one/two/three/four'

Гаразд, це працювало чудово і робив саме те, що мені потрібно. Я намагаюся використовувати це для зміни каталогу в каталог з пробілами в імені лише за допомогою аргументів. Для цього мені в кінцевому підсумку було потрібно створити функцію, яка буде змінювати каталоги, не вводячи апострофи, якщо у каталозі слова будуть розташовані між собою. Те , що я просто спробував було наступне: CDM () {вул = "" $ * "» CD $ вул} Це звертається тільки перший аргумент в вул Так приклад: тест CDM 2 Результат: «тест: Немає такого файлу або каталогу
Schwagmister

@Schwagmister: Ви можете зберегти його у (строкову) змінну, якщо хочете, але, якщо вам цього спеціально не потрібно, я думаю, cd "$*"це буде досить добре.
Скотт

@Schwagmister Єдині цитати тут не корисні. Спробуйте: cdm(){ str="$*"; cd "$str"; }або, як каже Скотт cdm(){ cd "$*"; }. Також пам’ятайте, що $*замінює кілька послідовних пробілів одним простором. Якщо у вашому імені каталогу може бути декілька послідовних пробілів або вкладок або нових рядків, перед тим, як перейти до cdmфункції , ці символи дійсно потрібно уникати .
John1024

Отже, якщо це щось на зразок тесту 2 випробування 1, як би я змусив цю команду CD правильно працювати? Також це дивовижна допомога, я дуже ціную це, хлопці. @Scott
Schwagmister

@Schwagmister Кращий спосіб це поставити одинарні лапки в командному рядку при виклику , cdmяк в: cdm 'test 2 trial 1'. Це впорається з усіма маєтками дивних імен. Однак, поки білі простори обмежуються однопросторовими, то cdmтоді це може бути запущено як cdm test 2 trial 1.
John1024

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.