hib*_*bou 32 variables bash quotes escaping
我生成一个包含所有args的bash变量,这些args包含空格.当我用这些args启动命令时 - 例如.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"
Run Code Online (Sandbox Code Playgroud)
有了这个,我对"file,n1","file and n2"有一些"没有这样的文件"错误
mar*_*ton 51
您可以考虑为args 使用数组,如下所示:
args=( "$f1" "$f2" )
ls "${args[@]}"
Run Code Online (Sandbox Code Playgroud)
(你目前遇到的问题是,一旦发生插值,文件名间和文件名间空间就没有区别.)
Arr*_*ell 33
使用eval它将首先评估任何扩展和引用,然后执行结果字符串,就像它已被输入shell一样.
args="'$f1' '$f2'"
eval ls $args
Run Code Online (Sandbox Code Playgroud)
然后eval将执行 ls 'file n1' 'file n2'
有一个非常类似的问题,试图通过争论从源变量/etc/default/,以start_stop_daemon在init脚本中.
使用set设置您的变量定位参数; 那么如果您通过"$@"或,等等引用它们"$1",引用将被保留"$2"。请确保在变量名周围使用双引号。
set -- "$f1" "$f2"
touch "$@"
ls "$@"
rm "$@"
Run Code Online (Sandbox Code Playgroud)
这可能是最糟糕的答案,但是您可以更改IFS。这是“内部字段分隔符”,默认情况下等于space + tab + newline。
#!/bin/sh
IFS=,
MAR="-n,my file"
cat $MAR
Run Code Online (Sandbox Code Playgroud)
上面的脚本将运行cat。第一个参数为-n(带编号的行),第二个参数为my file。
| 归档时间: |
|
| 查看次数: |
20739 次 |
| 最近记录: |