前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux shell 学习笔记

Linux shell 学习笔记

作者头像
付威
发布2021-05-06 10:53:02
9890
发布2021-05-06 10:53:02
举报

Shell 变量

代码语言:javascript
复制
chmod +x ./test.sh  #使脚本具有执行权限

变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

变量声明

代码语言:javascript
复制
your_name="runoob.com"
代码语言:javascript
复制
#!/bin/bash
my_name="Hello World !"
echo $my_name
echo ${my_name}
代码语言:javascript
复制
for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done
代码语言:javascript
复制
for file in `ls /etc`
或
for file in $(ls /etc)

只读变量

代码语言:javascript
复制
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

删除变量

代码语言:javascript
复制
#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl

Shell 字符串

单引号

代码语言:javascript
复制
str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

代码语言:javascript
复制
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出结果为:

代码语言:javascript
复制
Hello, I know you are "runoob"! 

拼接字符串

代码语言:javascript
复制
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
代码语言:javascript
复制
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:

代码语言:javascript
复制
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符 io 的位置(哪个字母先出现就计算哪个):

代码语言:javascript
复制
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

定义数组

在 Shell 中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:

代码语言:javascript
复制
数组名=(值1 值2 ... 值n)

例如:

代码语言:javascript
复制
array_name=(value0 value1 value2 value3)

或者

代码语言:javascript
复制
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

代码语言:javascript
复制
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。

读取数组

读取数组元素值的一般格式是:

代码语言:javascript
复制
${数组名[下标]}

例如:

代码语言:javascript
复制
valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:

代码语言:javascript
复制
echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

代码语言:javascript
复制
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

Shell 传递参数

代码语言:javascript
复制
#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

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

参数处理

说明

$#

传递到脚本的参数个数

$*

以一个单字符串显示所有向脚本传递的参数。 如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。 如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。

$-

显示Shell使用的当前选项,与set命令功能相同。

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

代码语言:javascript
复制
#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数:" $#;
echo "参数内容:" $*;
echo "脚本进程:" $$;                                 

Shell 基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 \`* 而不是单引号 *‘**):

代码语言:javascript
复制
#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

算术运算符

代码语言:javascript
复制
算术运算符实例如下:

实例
#!/bin/bash
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

关系运算符

运算符

说明

举例

-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:

运算符

说明

举例

!

非运算,表达式为 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。

逻辑运算符

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

运算符

说明

举例

&&

逻辑的 AND

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

\

\

逻辑的 OR

[[ $a -lt 100 \

\

$b -gt 100 ]] 返回 true

字符串运算符

下表列出了常用的字符串运算符,假定变量 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。

文件测试运算符

文件测试运算符用于检测 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: 检测文件是否存在并且是一个符号链接。
代码语言:javascript
复制
#!/bin/bash

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

Shell echo命令

1.显示普通字符串:

代码语言:javascript
复制
echo "It is a test"

2.显示转义字符

代码语言:javascript
复制
echo "\"It is a test\""

结果将是:

代码语言:javascript
复制
"It is a test"

3.显示变量

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

代码语言:javascript
复制
#!/bin/sh
read name 
echo "$name It is a test"

以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

代码语言:javascript
复制
[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

4.显示换行

代码语言:javascript
复制
echo -e "OK! \n" # -e 开启转义
echo "It is a test"

输出结果:

代码语言:javascript
复制
OK!

It is a test

5.显示不换行

代码语言:javascript
复制
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

输出结果:

代码语言:javascript
复制
OK! It is a test

6.显示结果定向至文件

代码语言:javascript
复制
echo "It is a test" > myfile

7.原样输出字符串,不进行转义或取变量(用单引号)

代码语言:javascript
复制
echo '$name\"'

输出结果:

代码语言:javascript
复制
$name\"

8.显示命令执行结果

代码语言:javascript
复制
echo `date`

注意: 这里使用的是反引号 `, 而不是单引号

结果将显示当前日期

代码语言:javascript
复制
Thu Jul 24 10:08:46 CST 2014

Shell printf 命令

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

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

printf 命令的语法:

代码语言:javascript
复制
printf  format-string  [arguments...]
代码语言:javascript
复制
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

Shell test 命令

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


数值测试

参数

说明

-eq

等于则为真

-ne

不等于则为真

-gt

大于则为真

-ge

大于等于则为真

-lt

小于则为真

-le

小于等于则为真

实例

代码语言:javascript
复制
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

输出结果:

代码语言:javascript
复制
两个数相等!

代码中的 [] 执行基本的算数运算,如:

实例

代码语言:javascript
复制
#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

结果为:

代码语言:javascript
复制
result 为: 11

文件测试

参数

说明

-e 文件名

如果文件存在则为真

-r 文件名

如果文件存在且可读则为真

-w 文件名

如果文件存在且可写则为真

-x 文件名

如果文件存在且可执行则为真

-s 文件名

如果文件存在且至少有一个字符则为真

-d 文件名

如果文件存在且为目录则为真

-f 文件名

如果文件存在且为普通文件则为真

-c 文件名

如果文件存在且为字符型特殊文件则为真

-b 文件名

如果文件存在且为块特殊文件则为真

实例

代码语言:javascript
复制
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

输出结果:

代码语言:javascript
复制
文件已存在!

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

实例

代码语言:javascript
复制
cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

输出结果:

代码语言:javascript
复制
至少有一个文件存在!
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-032,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shell 变量
    • 变量类型
      • 变量声明
        • 只读变量
          • 删除变量
          • Shell 字符串
            • 单引号
              • 双引号
                • 拼接字符串
                  • 提取子字符串
                    • 查找子字符串
                    • Shell 数组
                      • 定义数组
                        • 读取数组
                          • 获取数组的长度
                          • Shell 传递参数
                          • Shell 基本运算符
                            • 算术运算符
                              • 关系运算符
                                • 布尔运算符
                                  • 逻辑运算符
                                    • 字符串运算符
                                      • 文件测试运算符
                                      • Shell echo命令
                                        • 1.显示普通字符串:
                                          • 2.显示转义字符
                                            • 3.显示变量
                                              • 4.显示换行
                                                • 5.显示不换行
                                                  • 6.显示结果定向至文件
                                                    • 7.原样输出字符串,不进行转义或取变量(用单引号)
                                                      • 8.显示命令执行结果
                                                      • Shell printf 命令
                                                      • Shell test 命令
                                                        • 数值测试
                                                          • 实例
                                                          • 实例
                                                        • 文件测试
                                                          • 实例
                                                          • 实例
                                                      领券
                                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档