假设我有一个变量$ARGS
,其中包含以下内容:
file1.txt "second file.txt" file3.txt
如何将$ARGS
的内容作为参数传递给命令(例如cat $ARGS
),将"second file.txt"
视为一个参数而不将其拆分为{{1} }和"second
?
理想情况下,我希望能够将参数传递给任何命令,就像它们存储在变量中一样(从文本文件中读取,但我不认为这是相关的)
谢谢!
答案 0 :(得分:3)
可以在没有bash数组或eval
的情况下执行此操作:这是xargs
没有-0
或{{1}行为的少数几个地方之一扩展(一种主要产生错误的行为)实际上很有用。
-d
...或...
# this will print each argument on a different line
# ...note that it breaks with arguments containing literal newlines!
xargs printf '%s\n' <<<"$ARGS"
...或者,让# this will emit arguments in a NUL-delimited stream
xargs printf '%s\0' <<<"$ARGS"
# in bash 4.4, you can read this into an array like so:
readarray -t -d '' args < <(printf '%s\0' "$ARGS")
yourprog "${args[@]}" # actually run your programs
# in bash 3.x or newer, it's just a bit longer:
args=( );
while IFS= read -r -d '' arg; do
args+=( "$args" )
done < <(xargs printf '%s\0' <<<"$ARGS")
yourprog "${args[@]}" # actually run your program
# in POSIX sh, you can't safely handle arguments with literal newlines
# ...but, barring that, can do it like this:
set --
while IFS= read -r arg; do
set -- "$@" "$arg"
done < <(printf '%s\n' "$ARGS" | xargs printf '%s\n')
yourprog "$@" # actually run your program
本身进行调用:
xargs
答案 1 :(得分:1)
如Jonathan Leffler所述,您可以使用数组执行此操作。
my_array=( "file1.txt" "second file.txt" "file3.txt" )
cat "${my_array[1]}"
数组的索引从0开始。因此,如果您想要cat
数组中的第一个文件,则可以使用索引号0. "${my_array[0]}"
。如果要对所有元素运行命令,请将索引号替换为@
或*
。例如,代替"${my_arryay[0]}"
,您将使用"${my_array[@]}"
确保引用数组,或者将任何带空格的文件名视为单独的文件。
或者,如果由于某种原因引用数组是个问题,可以将IFS(代表内部字段分隔符)设置为等于换行符。如果这样做,最好在更改之前将默认IFS保存到变量,这样您就可以将其设置回脚本完成后的状态。例如:
# save IFS to a variable
old_IFS=${IFS-$' \t\n'}
#set IFS to a newline
IFS='$\n'
# run your script
my_array=( "file1.txt" "second file.txt" "file3.txt" )
cat ${my_array[1]}
# restore IFS to its default state
IFS=$old_IFS
除非必须,否则最好不要乱用IFS。如果你可以引用数组来使你的脚本工作,那么你应该这样做。
有关使用数组的更深入研究,请参阅:
答案 2 :(得分:0)
如果没有bash
isms ,普通的shell代码可能需要eval
:
# make three temp files and list them.
cd /tmp ; echo ho > ho ; echo ho ho > "ho ho" ; echo ha > ha ;
A='ho "ho ho" ha' ; eval grep -n '.' $A
输出:
ho:1:ho
ho ho:1:ho ho
ha:1:ha
请注意,eval
功能强大,if not used responsibly can lead to mischief ...