我正在制作一个 bash 脚本,但我有一些变量需要空格作为名称,我该如何制作它以便空格不会将其作为另一个参数示例
#!/bin/bash
mkdir $1
cp -a /home/x/Descargas/archivo.zip /var/www/html/
unzip /var/www/html/$1 /var/www/html/$1/
php /var/www/html/$1/install/index_cli.php --domain=$1 --db_server=$2 --db_name=$1 --prefix=$3 --db_user=$4 --db_password=$5 --email=$6 --name=$7
我运行它的那一刻,它是这样的 sudo ./script.sh varlor1 value2 value4 value5 value6 value7
但如果它是类似 sudo ./script.sh -value 2 -value3 -value4 等的东西,我可以输入空格并且在用 a 分隔之前不要使用下一个参数 - 谢谢
要添加包含空格的参数,请使用双引号:
"va lor"
您可以参考此问题以获取有关带有空格和特殊字符的参数的更多信息:https ://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other - 特殊字符
IFS 变量(内部字段分隔符)确定您作为参数输入的内容的行为,该变量会根据您使用的外壳而变化。如果您使用
bash
,则 IFS 是<espacio><tab><salto de línea>
,相反,如果您使用zsh
is<espacio><tab><salto de línea><carácter nulo>
。作为证明,您可以
$ echo -n "$IFS" | od -cb
在终端中运行并查看我的评论。IFS 变量是一个环境变量(您可以随意编辑,但要小心),shell 在扩展(大括号、路径名、命令替换、进程替换、变量扩展等)之后使用它们的字符作为分隔符。
引号可以防止两件事:1. 某些扩展,例如在变量中使用“*”可以防止它被扩展,2. 它可以防止它根据 IFS 中描述的字符被拆分。
所以你的脚本应该看起来像这样。
回到 IFS 的主题。如果你制作了这样的脚本。
你像这样运行它:
结果将尊重您输入的字符,结果如下:
相反,如果您将脚本更改为此(通过从参数替换中删除引号)
并且您以与前一个相同的方式运行它,输出将是这样的:
也就是说,它使用 IFS 变量的字符来分隔文本块。
man 1 bash
您可以在“报价”部分查阅有关此效果的文档。回到您提出请求的方式,我认为您担心程序中会根据标志考虑参数。我非常同意你的观点,只是我希望它更冗长,以避免系统管理员和使用该程序的开发人员之间产生混淆。所以我建议你应用放置命名参数的策略,我使用它的方式如下(我喜欢它比使用 getopts 更好)。
而且,只要您将变量放在引号中,它就会尊重所有 IFS 字符。
运行这个程序的方式(考虑一个夸张的例子)是这样的: