以下替代方法用于将参数传递给Bash shell下的可执行文件。我相信第一种方法目前比较常见。
方法1 - 将变量作为命令行参数传递
./myprogram --arg1 1
方法2 - 根据每个调用环境变量传递参数
arg1=1 ./myprogram
使用第二种方法时可能会出现什么问题?
这个密切相关的问题(Argument passing strategy - environment variables vs. command line)正在解决更广泛的环境变量使用问题,而不是我感兴趣的直接每次调用。
答案 0 :(得分:3)
第一种方法更常见,以便其他人更容易理解。
在大多数情况下,使用了环境变量($ ORACLE_HOME,$ JAVA,..),它不是在命令行中设置的,而是在不久之前设置并由不同脚本使用。因此,当您认为var应该是配置的一部分时,使用环境变量(作为默认值)就可以了 在其他情况下,我会使用参数。
如何修改脚本:
# First script calling myprogram that uses ...
# Difficult to see, the vars name and lastname
name="John"
while read -r lastname; do
./myprogram
done < lastnames.txt
现在有人想要更改循环并从数据库中获取具有环境变量username的所有用户。
name="John"
while read -r lastname; do
./myprogram
username="${lastname}" ~/bin/getdbusers
done < lastnames.txt
这次你很幸运,第二个人也使用var username
并且不知道./myprogram
使用lastname
的事实。他很想通过改变循环变量来引入一个bug:
name="John"
while read -r username; do
./myprogram # Oops, this should have been changed into lastname=username ./myprogam
~/bin/getdbusers
~/bin/somethingWithUserName
done < lastnames.txt
越来越难以理解哪些程序使用$ name和其他vars 使用参数可以更容易理解,并且可以防止错误:
name="John"
while read -r lastname; do
./myprogram "${name}" "${lastname}"
~/bin/getdbusers "${lastname}"
~/bin/somethingWithUserName "${lastname}"
done < lastnames.txt