我有 bash 脚本,它接收文件作为这样的参数:
>myscript dir/smalldir/file1.txt file3.txt
现在我想保存参数:
>args=$@
或者,
>args=$*
但是当我尝试使用它时,它会打印:
dirsmalldirfile1.txt file3.txt
没有斜线。我怎样才能解决这个问题?我是 bash 新手,有功课。
谢谢你。
我有 bash 脚本,它接收文件作为这样的参数:
>myscript dir/smalldir/file1.txt file3.txt
现在我想保存参数:
>args=$@
或者,
>args=$*
但是当我尝试使用它时,它会打印:
dirsmalldirfile1.txt file3.txt
没有斜线。我怎样才能解决这个问题?我是 bash 新手,有功课。
谢谢你。
如果更改 IFS 的设置,即字段间分隔符,您可以接近看到的结果:
$ set -- "/abc/def/ghi" "jkl" "mno pqr/stu vwx"
$ print "%s\n" "$@"
abc/def/ghi
jkl
mno pqr/stu vwx
$ echo "$@"
abc/def/ghi jkl mno pqr/stu vwx
$ IFS=/
$ echo $@
abc def ghi jkl mno pqr stu vwx
$ IFS=$' \t\n'
$
这不会将单词放在一起,但确实会丢失斜线。为了更好地诊断您的问题,您需要在脚本中提供更多代码。
与消失的斜线无关,如果您需要保存参数,您应该真正使用:
args=("$@")
这会将文件名保存到一个数组中,保持名称分开并正确处理空格。然后,您可以使用从 0 开始的索引访问单独的文件名:
echo "${args[1]}"
echo "${args[@]}"
for file in "${args[@]}"; do ...; done
问题中使用的符号是:
args=$*
args=$@
它们都将文件名保存为单个字符串,其中空格分隔原始名称。如果原始文件名中有任何空格,则无法可靠地将其拆分为原始文件名。大多数时候,这不是你想要的。