#!/bin/bash
$ ./test1
bash: ./test1: Permission denied
$ ls -l test1
-rw-r--r-- 1 user user 73 Jun 02 15:36 test1
$ chmod u+x test1
$ ./test1
// 执行结果打印
$ echo "This is a test to see if you're paying attention"
This is a test to see if you're paying attention
$ echo 'Rich says "scripting is easy".'
Rich says "scripting is easy".
echo The time and date are:
date
改成:
echo -n "The time and date are:"
变量允许在 shell 脚本中临时存储信息,以便同脚本中的其他命令一起使用。
环境变量
#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME
$ echo "The cost of the item is $15"
The cost of the item is 5
$ echo "The cost of the item is \$15"
The cost of the item is $15
var1=10
var2=-57
var3=testing
var4="still more testing"
testing=`date`
testing=$(date)
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
command > outputfile
command < inputfile
command << marker
data
marker
$ wc << EOF
> test string 1
> test string 2
> test string 3
> EOF
3 9 42
command1 | command2
$ ls -al | more
在 shell 脚本中,执行数学运算有两种方式:
expr 命令
运算符 | 描述 |
---|---|
ARG1 | ARG2 | 如果 ARG1 既不为 null 也不为 0 ,就返回 ARG1;否则,返回 ARG2 |
ARG1 & ARG2 | 如果 ARG1 和 ARG2 都不为 null 或 0 ,就返回 ARG1;否则,返回 0 |
ARG1 < ARG2 | 如果 ARG1 小于 ARG2,就返回 1 ;否则,返回 0 |
ARG1 <= ARG2 | 如果 ARG1 小于或等于 ARG2,就返回 1 ;否则,返回 0 |
ARG1 = ARG2 | 如果 ARG1 等于 ARG2,就返回 1 ;否则,返回 0 |
ARG1 != ARG2 | 如果 ARG1 不等于 ARG2,就返回 1 ;否则,返回 0 |
ARG1 >= ARG2 | 如果 ARG1 大于或等于 ARG2,就返回 1 ;否则,返回 0 |
ARG1 > ARG2 | 如果 ARG1 大于 ARG2,就返回 1 ;否则,返回 0 |
ARG1 + ARG2 | 返回 ARG1 和 ARG2 之和 |
ARG1 - ARG2 | 返回 ARG1 和 ARG2 之差 |
ARG1 * ARG2 | 返回 ARG1 和 ARG2 之积 |
ARG1 / ARG2 | 返回 ARG1 和 ARG2 之商 |
ARG1 % ARG2 | 返回 ARG1 和 ARG2 之余数 |
STRING : REGEXP | 如果 REGEXP 模式匹配 STRING,就返回该模式匹配的内容 |
match STRING REGEXP | 如果 REGEXP 模式匹配 STRING,就返回该模式匹配的内容 |
substr STRING POS LENGTH | 返回起始位置为 POS (从 1 开始计数)、长度为 LENGTH 的子串 |
index STRING CHARS | 返回 CHARS 在字符串 STRING 中所处的位置;否则,返回 0 |
length STRING | 返回字符串 STRING 的长度 |
$ var1=$[1 + 5]
$ echo $var1
6
$ var2=$[$var1 * 2]
$ echo $var2
12
$ bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit
$ bc -q
var1=10
var1 * 4
40
var2 = var1 / 5
print var2
2
quit
variable=$(echo "options; expression" | bc)
#!/bin/bash
var1=$(echo " scale=4; 3.44 / 5" | bc)
echo The answer is $var1
variable=$(bc << EOF
options
statements
expressions
EOF
)
$ cat test12
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5
$
Linux 提供了专门的变量 ? 来保存最后一个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用 ?来保存最后一个已执行命令的退出状态码。对于需要进行检查的 命令,必须在其运行完毕后立刻查看或使用 ?来保存最后一个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用?变量。这是因为该变量的值会随时变成由 shell 所 执行的最后一个命令的退出状态码。
按照惯例,对于成功结束的命令, 其退出状态码是 0。对于因错误而结束的命令,其退出状态码是一个正整数。
无效命令会返回退出状态码 127。
Linux 退出状态码
状态码 | 描述 |
---|---|
0 | 命令成功结束 |
1 | 一般性未知错误 |
2 | 不适合的 shell 命令 |
126 | 命令无法执行 |
127 | 没找到命令 |
128 | 无效的退出参数 |
128+x | 与 Linux 信号 x 相关的严重错误 |
130 | 通过 Ctrl+C 终止的命令 |
255 | 正常范围之外的退出状态码 |
退出状态码 126 表明用户没有执行命令的正确权限
另一个常见错误是给命令提供了无效参数,这会产生一般性的退出状态码 1,表明在命令中发生了未知错误。
$ cat test13
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[ $var1 + $var2 ]
echo The answer is $var3
exit 5
$
$ chmod u+x test13
$ ./test13
The answer is 40
$ echo $?
5
$
$date -d "Jan 1, 2020" +%s
1577854800
$