Подтвердить что ты не робот

Bash - переменная, содержащая несколько аргументов с кавычками

Я генерирую переменную bash, содержащую все мои аргументы, и эти аргументы содержат пробелы. Когда я запускаю команду с этими аргументами - например. ls $args - кавычки неправильно интерпретируются. Вот пример - также создание и удаление необходимых файлов.

#!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"

С этим у меня есть некоторые ошибки "нет такого файла" для "файла, n1" , "file и n2"

4b9b3361

Ответ 1

Вы можете использовать array для аргументов, что-то вроде этого:

args=( "$f1" "$f2" )
ls "${args[@]}"

(Проблема, с которой вы сейчас сталкиваетесь, заключается в том, что после интерполяции не было различий между пространствами внутри и между именами.)

Ответ 2

Используйте eval, это сначала оценит любые расширения и цитирование, а затем выполнит результирующую строку, как если бы она была введена в оболочку.

args="'$f1' '$f2'"
eval ls $args

eval будет выполнять ls 'file n1' 'file n2'

Была очень похожая проблема, пытаясь передать аргументы в переменных, полученных из /etc/default/ в start_stop_daemon в сценариях инициализации.

Ответ 3

Это, вероятно, самый худший ответ, но вы можете изменить IFS. Это "внутренний разделитель полей" и по умолчанию равен пробелу + tab + новая строка.

#!/bin/sh
IFS=,
MAR="-n,my file"
cat $MAR

script выше будет cat. Первый аргумент будет -n (пронумерованные строки), а второй аргумент будет my file.

Ответ 4

Используйте set, чтобы установить переменные в качестве позиционных параметров; то цитирование будет сохранено, если вы ссылаетесь на них через "$ @" или "$ 1", "$ 2" и т.д. Обязательно используйте двойные кавычки, которые содержат имена переменных.

set -- "$f1" "$f2"
touch "[email protected]"
ls "[email protected]"
rm "[email protected]"

Ответ 5

Вот мой рецепт concat цитированных аргументов - в основном используется для чтения script. Но также удобно комментировать некоторые аргументы легко:

PARAM1="a param with white spaces"
PARAM2="some other funny param"
PARAM3="third spaced param"
#...

PARAMS=$PARAM1
PARAMS+='" "'
PARAMS+=$PARAM2
PARAMS+='" "'
PARAMS+=$PARAM3
#...

eval command '"'$PARAMS'"'