有人告诉我,空格在bash
其他 shell 脚本中很重要,除非我知道自己在做什么,否则我不应该改变空格的存在。通过“改变存在”我的意思是在两个非空格字符之间插入空格或删除两个非空格字符之间的空格,例如更改var="$val"
为var ="$val"
或反之亦然。我想问一下
在 shell 脚本中使用单个空格或使用多个连续空格是否会产生影响?。
(当然,在引号中插入/删除空格会有所不同,例如从 改为echo "a b"
或echo "a b"
反之亦然。我正在寻找除这个简单示例之外的示例。)
我遇到过这个问题但这是关于在两个非空格字符之间添加和删除空格,我知道很多例子,这会产生影响。
任何帮助,将不胜感激。如果可能的话,包括更多种类的贝壳。
答案1
这可能是作弊,但是:
rm foo\ bar # "delete the file named 'foo bar'"
与此不同:
rm foo\ bar # "delete the files named 'foo ' and 'bar'"
即使空间是不是用引号引起来。 ;-)
更令人困惑的是,这个:
rm \
foo # "delete the file named 'foo'"
与此不同:
rm \
foo # "delete the file named ' ', then run the command 'foo'"
即使他们看完全相同的!
答案2
在引号之外,shell 使用空格(空格、制表符、换行符、回车符等)作为单词/标记分隔符。这意味着:
- 没有被空格分隔的事物被认为是一“单词”。
- 由一个或多个空白字符分隔的事物被视为两个(或多个)单词。
每个“事物”之间的实际空白字符数量并不重要,只要至少有一个即可。
答案3
如果我们不谈论空格字符 ( U+0020
),但是任何空白字符(U+0020
、\n
、\t
等),然后我想到了一种特殊情况:Here-Documents。
此代码(使用空格):
cat <<- 'EOF'
<space><space>foo
EOF
将打印:
foo
但是这段代码(使用选项卡):
cat <<- 'EOF'
<tab><tab>foo
EOF
将打印:
foo
那是因为 (正如 POSIX 所说):
如果重定向运算符是
<<-
,则应从输入行和包含尾随定界符的行中删除所有前导 <tab> 字符。
答案4
我遇到了一个关于“空间”的好例子,并想在这里分享。对于 i 介于 100 到 1000 之间的情况,以下条件的计算结果不为 true。
if [ $i -ge 100 -a $i -lt 1000]; then <some code here> fi
请注意 1000 和右方括号之间缺少空格
但当它更改为如下所述时,它会按预期工作。
> if [ $i -ge 100 -a $i -lt 1000 ]; then <some code here> fi