我使用缩进选项卡在文本编辑器中编写脚本,因为键入1 Tab比4 Space更容易。然而,我只是想弄清楚为什么下面的if语句(它在我的bash脚本中工作)不能在命令行上工作,这让我自己发疯了:
dirs=(HIC11490 HIC11493 HIC11494)
for i in "${dirs[@]}"; do
if [ -d "$i" ]; then
echo $i exists;
else
echo $i does not exist;
fi
done具体来说,它列出了工作目录中的所有文件:
$ nums=(HIC11490 HIC11493 HIC11494)
$ for i in "${nums[@]}"; do
> if [ -d "$i" ]; then
>
Display all 13526 possibilities? (y or n)
14295291/ HIC3958/
AG25/ HIC3959/
AG36/ HIC3969/
AG48_Aleksei/ HIC397/
BGS-11/ HIC3970/
BSCC/ HIC3971/
. .
. .
. .
DNA128/ HIC4465/
DNA129/ HIC4466/
> ot exist;
> fi
> done
-bash: ot: command not found
-bash: ot: command not found
-bash: ot: command not found事实证明,制表符是问题所在,如果用空格替换这些选项卡,代码可以从命令行工作。
在bash脚本中是否还有与我应该知道的命令行不同的其他字符?谢谢。
发布于 2020-01-31 00:27:51
将tab发送到bash将触发自动完成。两个tab字符触发显示所有可能的完成。Bash看到您开始输入for i in "${nums[@]}"; do,然后输入两个tab触发器自动完成。在这种情况下,由于找不到与注册完成匹配的内容,所以大多数自动完成脚本都会列出当前目录中的所有文件。如果列表比某个长度长,则会显示一个Display all 13526 possibilities?问题。然后从输入中读取字符以回答Display all 13526 possibilities? (y or n)部分(即。echo将作为这个问题的答案通过.)剧本就分崩离析。
这都是可配置的。Bash使用GNU读出线库读取您键入的内容和自动完成的库句柄(部件)。
发布于 2020-01-31 06:12:06
要回答您问题的第二部分(因为KamilCuk已经回答了第一部分),您应该注意的其他字符是#和!。
在脚本(非交互式shell )中,#引入一个注释,而在交互式shell中,您可以配置(不管情况是否如此),也可以在命令开始时将散列视为有效字符。这由shopt的shopt设置控制。
在交互式shell中,!引入历史替换(即用最近命令的最后一个参数替换!$ )。此替换不发生在bash脚本中。
https://stackoverflow.com/questions/59996238
复制相似问题