一文教你shell编程

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章
笔记的只是方便各位师傅学习知识,以下只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负

一、脚本的创建执行以及变量使用

1.1 创建与执行

首先创建一个1.sh,

可以利用#!/bin/bash、#!/bin/dash 、#!/bin/sh三种脚本解释器,不管调用哪种最后还是调用还是这个dash

ls -l /bin/dash
ls -l /bin/bash
ls -l /bin/sh

新建一个sh文件是没有执行权限,需要加权

chmod +777 1.sh
chmod +u+x 1.sh
./1.sh

除了加权,还可以脚本解释器直接执行,脚本解释器具有一定权限

sh 1.sh
bash 1.sh
dash 1.sh
source 1.sh

1.2 变量使用

变量定义

定义一个name变量打印

name = "xiaoyu"
echo $name                                 //变量使用在前面加dollar符
echo ${name}                               //完整写法应加上花括号以防变量拼接

age="27"
echo $age

echo my name is $name,and my age is $age years old
echo "my name is $name,and my age is $age years old"
echo 'my name is $name,and my age is $age years old'

变量拼接

变量拼接导致变量未定义,可以用双引号或者花括号括起来

age = 27 
echo $age
echo $age years
echo $ageyears            //变量拼接
echo "$age"years
echo {$age}years

查看和删除变量

set | grep name        //查看变量
unset name             //删除变量,unset不能删除只读变量如readonly name,此时name无法删除

变量类型

字符串变量:在 Shell中,变量通常被视为字符串,可以使用单引号 ’ 或双引号 " 来定义字符串

str = "hello world!"
str = 'hello world!'

整数变量:在一些Shell中,可以使用 declare 或 typeset 命令来声明整数变量,不声明也行

declare -i num = 42
num = 42

数组变量:Shell 也支持数组,允许在一个变量中存储多个值,数组可以是整数索引数组或关联数组

my_array=(1 2 3 4 5)                //整数索引数组

declare -A associative_array        //关联数组
associative_array["name"]="John"
associative_array["age"]=30

二、 基本命令

2.1 echo命令

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出

echo "It is a test"
echo It is a test                 //两个都是打印字符串
echo "\"It is a test\""           //显示转义字符

read name 
echo "$name It is a test"         //显示变量

echo -e "OK! \n"                  //-e 开启转义显示换行\n 
echo "It is a test"

echo -e "OK! \c"                  //-e 开启转义\c不换行
echo "It is a test"

echo '$name\"'                   //使用单引号原样输出

echo `date`                    //显示命令执行结果(反引号)

2.2 printf命令

printf 命令模仿 C 程序库(library)里的 printf() 程序。

指定格式输出

s:字符串
%d:十进制整数
%f:浮点数
%c:字符
%x:十六进制数
%o:八进制数
%b:二进制数
%e:科学计数法表示的浮点数

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,
以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽
的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留 2 位小数。

2.3 test命令

用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字
符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

三、 永久环境变量

3.1 常见变量

echo $HOME   //根目录
which -a ls  //查看ls脚本路径
echo $PATH   //环境变量  PATH 变量包含了操作系统搜索可执行文件的路径

3.2 特殊变量

$0 :脚本名称
$1, $2,$3 .... 等表示脚本参数
$#:传递给脚本的参数数量
$?:表示上一个命令的退出状态

3.3 设立临时变量

将/root目录直接添加到环境变量,整个/root目录的文件都可以执行

export PATH=/root:PATH
echo $PATH

将目录添加到当前会话的环境变量的开头。这意味着,当你在命令行中输入一个命令时,系统会首先在目录下查找该命令,以上更改只会影响当前会话,不是永久变量

3.4 设立永久变量

  1. 将脚本放入环境变量的路径。比如直接写到/usr/bin 系统级可执行文件的默认位置
  2. 写入配置文件

打开文件,并添加环境变量设置

vi .bashrc
文件末尾写入 export PATH=/root::PATH
source (变量生效,或者重启生效)

对于所有用户,可以在全局配置文件中设置环境变量

/etc/environment:

vi /etc/environment
写入 PATH="/root:$PATH"

/etc/profile:

在这里添加环境变量设置,会影响到所有用户

vi  /etc/profile
export PATH=/usr/local/bin:$PATH    //添加 /usr/local/bin 到 PATH 环境变量
source /etc/profile
echo $PATH

/etc/profile.d/*.sh:

可以在目录下创建一个或多个以结尾的脚本文件,并在其中设置环境变量。这些脚本将在被执行时被调用。

touch /etc/profile.d/myenv.sh
vi /etc/profile.d/myenv.sh
export PATH=/root:$PATH                   //写入
chmod +x /etc/profile.d/myenv.sh
source /etc/profile.d/myenv.sh
echo $PATH

四、 字符串显位

4.1. Shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用

双引号字符串的优点:

双引号里可以有变量

双引号里可以出现转义字符

your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出:Hello, I know you are "runoob"! 

4.2 字符串显位

str = "hello world"
echo ${#str}             //输出字符串长度
echo ${str:0:6}          //打印前五个字符

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4   //查找子字符i或o,谁先出现计算谁 注意是反引号`

五、脚本参数传递与数学运算

5.1 脚本参数传递

echo 执行的文件名是:$0
echo 第一个参数是:$1
echo 第二个参数为:$2
echo 第三个参数为:$3
echo 传递的参数作为一个字符串显示:$*
echo 传递的参数独立作为每一个字符串显示:$@
echo 传递到脚本参数个数是:$#
echo 最后命令退出状态:$?
echo 脚本运行的当前进程的ID是:$$

$*与$@不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,
则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

sh 9.sh name         //指定参数name
echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

5.2 数学运算

使用expr进行运算

expr 5+10                               //直接输出5+10
expr 5 + 10                             //计算5 + 10
expr 10 - 5                             //计算10 - 5
expr 10 \* 5                            //乘法需要反斜杠转义
expr 10 / 5                             //取整
expr 10 % 5                             //取余
expr \(5 + 10\)\*7                      //括号也需要转义


name = `expr \(5 + 10\)\*7`              //这里使用的是反引号,完整的表达式要被 ` ` 包含
echo $name



# 初始化变量
num=5
# 自增
num=$(expr $num + 1)
# 自减
num=$(expr $num - 1)
echo $num

使用$(( ))运算

# 初始化变量
num=5
# 自增
num=$((num + 1))
# 自减
num=$((num - 1))
echo $num

使用 (( )) 进行运算

# 初始化变量
num=5
# 自增
((num++))
# 自减
((num--))
echo $num
# 初始化变量
num=5
echo "初始值: $num"

# 自增
let num++
echo "自增后: $num"

# 自减
let num--
echo "自减后: $num"

# 使用 $(( ))
num=$((num + 1))
echo "使用 $(( )) 自增后: $num"

num=$((num - 1))
echo "使用 $(( )) 自减后: $num"

# 使用 expr
num=$(expr $num + 1)
echo "使用 expr 自增后: $num"

num=$(expr $num - 1)
echo "使用 expr 自减后: $num"

# 使用 (( ))
((num++))
echo "使用 (( )) 自增后: $num"

((num--))
echo "使用 (( )) 自减后: $num"

六、运算符

6.1 算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20;

运算符 说明 举例
+ 加法 expr $a + $b 结果为 30。
- 减法 expr $a - $b 结果为 -10。
* 乘法 expr $a \* $b 结果为 200。
/ 除法 expr $b / $a 结果为 2。
% 取余 expr $b % $a 结果为 0。
= 赋值 a=$b 把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

6.2 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

6.4 布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

6.5 逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi
num1=9
num2=19
if[$num1!=9]; then
  echo num1不等于9
else
  echo num1等于9

余运算
num1=9
num2=19
if ["$num1" != "9" -a "$num2" -lt "20"]; then              //-a连接两个条件相当于&
  echo true
else
  echo false
fi


if ["$num1" != "9" -o "$num2" -lt "20"]; then              //-o连接两个条件相当于|
  echo true
else
  echo false
fi

6.6 字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。
$ 检测字符串是否不为空,不为空返回 true。 [ $a ] 返回 true。
a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi
str1 = "hello"
str2 = "hello"
if ["$str1" = "$str2"]; then
  echo true
else
  echo false
fi

// -z 检查字符串长度是否为0
if [-z "$str1"]; then
  echo true
else 
  echo false
fi


//-n 检查字符串长度是否不为0
if [-n "$str1"]; then
  echo true
else 
  echo false
fi

6.7.文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: 检测文件是否存在并且是一个符号链接。

变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

七、脚本与用户交互

7.1 脚本交互

read name age
xiaoyu 26
echo $name
echo $age

bash                                       //进入bash环境
read -p "请输入你的姓名:" name
read -p "请输入你的姓名:" name -t 10        //-t 指定时间自动退出
read -n 3 -t 10 -p "请输入你的姓名:" name   // -n 指定输入长度

模拟脚本

read -p "请输入你的姓名:" name
echo "你输入的姓名为$name"

八、流程控制

if else 语句
if else 的 […] 判断语句中大于使用 -gt,小于使用 -lt。

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <

a=10
b=20
if (( $a == $b ))
then
   echo "a 等于 b"
elif (( $a > $b ))
then
   echo "a 大于 b"
elif (( $a < $b ))
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

if else 语句经常与 test 命令结合使用,如下所示

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

if语句写成一行

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

case 语句
匹配数字

read -p "请你输入一个数值:" num
case $num in
  1)echo 你输入的数字是1
  ;;
  2)echo 你输入的数字是2
  ;;
  3)echo 你输入的数字是3
  ;;
  *)echo 你输入的是其他数字
  ;;
esac

匹配字符串

read -p "请你输入字符串:" site
case "$site" in
   "bing") echo "Bing 搜索"
   ;;
   "google") echo "Google 搜索"
   ;;
   "baidu") echo "百度搜索"
   ;;
esac

九、循环控制

for循环
顺序输出数字

for num in 1 2 3 4 5
do                                       //表示for循环执行的操作
  echo "The number is $num"
done                                     //for循环结束关键字


for i in 'seq 1 100'                      //seq从1到100
do
  echo $i
done


for i in $(seq 1 100)
do
  echo $i
done


for ((i=1;i<100;i++))
do
  echo $i
done

顺序输出字符串的字符

for str in "hello world"
do                       
  echo $str
done

while循环

i=1
while(($i<100))
do
  echo $i
  ((i++))
done


i=1
while(($i<=10))
do
  echo $i
  let "i++"
done

until循环

i=0
until [! $i -lt 10]
do
  echo $i
  ((i++))
done

break
break跳出所有循环(终止执行后面的所有循环)

while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

continue
continue 不会跳出所有循环,仅仅跳出当前循环

while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

十、函数创建调用

10.1 函数基本创建及调用

DemoFunc(){
  echo "hello world"
}
DemoFunc

10.2 带return函数

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" 

//函数返回值在调用该函数后通过 $? 来获得

10.3 函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数

DemoFunc(){
  echo "hello world"
  echo "My name is $1"
}
DemoFunc xiaoyu

DemoFunc(){
  echo "hello world"
  echo "My name is $1,and my age is $2 years old"
}
DemoFunc xiaoyu 27

注意, 10 不能获取第十个参数,获取第十个参数需要 10 不能获取第十个参数,获取第十个参数需要 10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

十一、脚本包含

假设存在2.sh,新建3.sh写入2.sh

然后bash 3.sh 可以调用执行2.sh

name = "xiaoyu"
age = 23
source 2.sh           //或者../2.sh 使用.来引用2.sh文件
echo "My name is $name,and I am$age years old"

bash 3.sh

十二、重定向

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

12.1 输出重定向

ls > 1.txt                     //将ls执行返回的内容输入重定向1.txt
who > 1.txt                   //将who执行返回的内容输入重定向1.txt

可以看出 > 会覆盖1.txt内容,可以使用>>追加

ls > /dev/nul                //将ls重定向至回收站     执行但无回显 

12.2 输入重定向

ls -l < dirs.txt      //从dirs.txt读取内容
command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

12.3 文件描述符

0:标准输入
1:标准输出
2:错误输出


ls > 3.txt 2 > 5.txt
如果ls输出正确会输出到3.txt

coo > 3.txt 2 > 5.txt
如果coo输出错误会输出到5.txt,输出详细错误信息