#《快乐的 Linux 命令行》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# Program to output a system information page
TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
report_uptime () {
return
}
report_disk_space () {
return
}
report_home_space () {
return
}
cat << _EOF_
<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
$(report_uptime)
$(report_disk_space)
$(report_home_space)
</BODY>
</HTML>
_EOF_
1
2
3
4
5
6
7
8
9
10
11
12
13
$ ./t.sh
<HTML>
<HEAD>
<TITLE>System Information Report For hs-Z390-AORUS-PRO</TITLE>
</HEAD>
<BODY>
<H1>System Information Report For hs-Z390-AORUS-PRO</H1>
<P>Generated 2021年04月25日 下午 11时09分51秒 CST, by hs</P>



</BODY>
</HTML>

#if

1
2
3
4
5
6
7
if commands; then
commands
[elif commands; then
commands...]
[else
commands]
fi

#$?

当命令执行完毕后,命令会给系统发送一个值,叫做退出状态。这个值是一个0255之间的整数,说明命令执行成功或是失败。按照惯例,一个零值说明成功,其它所有值说明失败。

1
2
3
4
5
6
(base) hs@hs-Z390-AORUS-PRO:/mnt/data/onns/Desktop$ true
(base) hs@hs-Z390-AORUS-PRO:/mnt/data/onns/Desktop$ echo $?
0
(base) hs@hs-Z390-AORUS-PRO:/mnt/data/onns/Desktop$ false
(base) hs@hs-Z390-AORUS-PRO:/mnt/data/onns/Desktop$ echo $?
1

#文件表达式

1
[ expression ]
表达式 返回true的条件
file1 -ef file2 file1file2拥有相同的索引号(通过硬链接两个文件名指向相同的文件)
file1 -nt file2 file1新于file2
file1 -ot file2 file1早于file2
-b file file存在并且是一个块(设备)文件
-c file file存在并且是一个字符(设备)文件
-d file file存在并且是一个目录
-e file file存在
-f file file存在并且是一个普通文件
-g file file存在并且设置了组ID
-G file file存在并且由有效组ID拥有
-k file file存在并且设置了它的sticky bit[1]
-L file file存在并且是一个符号链接
-O file file存在并且由有效用户ID拥有
-p file file存在并且是一个命名管道
-r file file存在并且可读(有效用户有可读权限)
-s file file存在并且其长度大于零
-S file file存在并且是一个网络socket
-t fd fd是一个定向到终端/从终端定向的文件描述符。这可以被用来决定是否重定向了标准输入/输出错误
-u file file存在并且设置了setuid
-w file file存在并且可写(有效用户有可写权限)
-x file file存在并且可执行(有效用户有执行/搜索权限)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# test-file: Evaluate the status of a file
FILE=~/.bashrc
if [ -e "$FILE" ]; then
if [ -f "$FILE" ]; then
echo "$FILE is a regular file."
fi
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
if [ -r "$FILE" ]; then
echo "$FILE is readable."
fi
if [ -w "$FILE" ]; then
echo "$FILE is writable."
fi
if [ -x "$FILE" ]; then
echo "$FILE is executable/searchable."
fi
else
echo "$FILE does not exist"
exit 1
fi
exit
1
2
3
4
5
$ chmod +x test-file.sh
$ ./test-file.sh
/home/hs/.bashrc is a regular file.
/home/hs/.bashrc is readable.
/home/hs/.bashrc is writable.

引号并不是必需的,但这是为了防范空参数。如果$FILE的参数展开是一个空值,就会导致一个错误(操作符将会被解释为非空的字符串而不是操作符)[2][3]。用引号把参数引起来就确保了操作符之后总是跟随着一个字符串,即使字符串为空。


  1. 有机会查一下这是啥东西。 ↩︎

  2. 这里也不知道是什么意思。。。虽然我一直是这样做的。 ↩︎

  3. 好的知道了,我去提问了= =,传送门:What’s the difference between using quotation with parameters and not using in a shell script ↩︎