【发布时间】:2022-11-03 23:44:58
【问题描述】:
我有一个接受路径作为输入的脚本。然后它使用 IFS 解析路径的组件,将它们存储在一个数组中。这很好用。
但它也修改了变量!似乎没有什么办法可以避免。它甚至会修改变量的任何副本。我需要保留原始变量的副本而不进行任何修改,但它不会这样做。
示例脚本:
#!/bin/bash
dir=$1
copy_of_dir=$dir
echo 'directory =' $dir
echo 'copy of directory =' $copy_of_dir
IFS='/'
read -a array <<< $dir;
echo ${array[1]}
echo ${array[2]}
echo 'directory =' $dir
echo 'copy of directory =' $copy_of_dir
运行它会产生:
$ ./myscript.sh /home/myself
directory = /home/myself
copy of directory = /home/myself
home
myself
directory = home myself
copy of directory = home myself
$
哎呀。这里有一些基本的东西我不明白。
【问题讨论】:
-
echo $anything本身就是不安全的。总是,总是echo "$anything" -
顺便说一句,这是shellcheck.net 会为您标记的内容,而无需人工审核。
-
顺便说一句:不是
read改变了你的变量;是IFS=/改变了后续不带引号的扩展解析变量的方式。如果您将IFS=/ read -a array <<<"$dir"全部放在一行中,并且在赋值和read之间没有命令分隔符,则不会发生这种情况,因为对IFS的更改将仅限于read的单独调用。
标签: bash parsing variable-assignment ifs