Передача аргументов команде в Bash script с пробелами
Я пытаюсь передать 2 аргумента команде, и каждый аргумент содержит пробелы, я попытался экранировать пробелы в args, я пробовал обертывание в одинарных кавычках, я пытался убежать \", но ничего не будет работа.
Вот простой пример.
#!/bin/bash -xv
ARG="/tmp/a b/1.txt"
ARG2="/tmp/a b/2.txt"
ARG_BOTH="\"$ARG\" \"$ARG2\""
cat $ARG_BOTH
Я получаю следующее, когда он запускается:
ARG_BOTH="$ARG $ARG2"
+ ARG_BOTH='/tmp/a\ b/1.txt /tmp/a\ b/2.txt'
cat $ARG_BOTH
+ cat '/tmp/a\' b/1.txt '/tmp/a\' b/2.txt
cat: /tmp/a\: No such file or directory
cat: b/1.txt: No such file or directory
cat: /tmp/a\: No such file or directory
cat: b/2.txt: No such file or directory
Ответы
Ответ 1
См. http://mywiki.wooledge.org/BashFAQ/050
TL;DR
Поместите свои аргументы в массив и вызовите свою программу как myutil "${arr[@]}"
#!/bin/bash -xv
file1="file with spaces 1"
file2="file with spaces 2"
echo "foo" > "$file1"
echo "bar" > "$file2"
arr=("$file1" "$file2")
cat "${arr[@]}"
Выход
file1="file with spaces 1"
+ file1='file with spaces 1'
file2="file with spaces 2"
+ file2='file with spaces 2'
echo "foo" > "$file1"
+ echo foo
echo "bar" > "$file2"
+ echo bar
arr=("$file1" "$file2")
+ arr=("$file1" "$file2")
cat "${arr[@]}"
+ cat 'file with spaces 1' 'file with spaces 2'
foo
bar
Ответ 2
Это может быть хорошим вариантом использования для общей команды "set", которая устанавливает параметры оболочки верхнего уровня в список слов. То есть, $1, $2,... и так же $* и [email protected] reset.
Это дает вам некоторые преимущества массивов, а также поддерживает совместимость с Posix-shell.
Итак:
set "arg with spaces" "another thing with spaces"
cat "[email protected]"
Ответ 3
Самая простая версия вашего примера оболочки script, которая будет работать правильно:
#! /bin/sh
ARG="/tmp/a b/1.txt"
ARG2="/tmp/a b/2.txt"
cat "$ARG" "$ARG2"
Однако, если вам нужно обернуть целую кучу аргументов в одной переменной оболочки, вы встанете на ручей; нет портативного, надежного способа сделать это. (Массивы Bash -специфичны, единственными переносимыми параметрами являются set
и eval
, оба из которых требуют горя.) Я бы счел нужным для этого как указание на то, что пришло время переписать более мощный скриптовый язык, например Perl или Python.