Shell基础

时间:2022-07-24
本文章向大家介绍Shell基础,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

入参和默认变量

对于shell脚本而言,有些内容是专门用于处理参数的,它们都有特定的含义

/home/shouwang/test.sh para1 para2 para3
$0 $1 $2 $3
脚本名 第一个参数 第二个参数 第三个参数

除此之外,还有一些其他的默认变量,例如:

$# 代表脚本后面跟的参数个数,前面的例子中有3个参数
$@ 代表了所有参数,并且可以被遍历
$*代表了所有参数,且作为整体,和$*很像,但是有区别
$$ 代表了当前脚本的进程ID
$?代表了上一条命令的退出状态

执行脚本的方法

“./”:(相对或绝对路径)这种方法脚本必须得需要可执行权;
sh:通过/bin/sh来解释脚本;
source或“.”:内部命令来加载脚本中的内容。
前两种方法是在子shell中执行;第三种方法是在当前shell中执行

Shell变量

Linux系统下常见的四种变量 1.自定义变量 自定义变量是由系统用户自己定义的变量吗,只在用户自己的Shell环境中有效,因此,也有人称为本地变量。在编写Shell脚本程序是,用户通常会设定一些特定的自定义变量,以适应程序执行过程中各种变化,以满足不同的需求。

1>定义新的变量 定义变量的基本格式“变量名=变量值”,等号两边不允许有空格。变量名称需要以字母或下划线开头,名称中不要包含特殊字符(比如:+、-、*、/、……?、&、%等)。比如:

[root@linux /]# a=Hello
[root@linux /]# b=world

2>查看和引用变量 通常在变量名称前添加前导符“$”,可以引用一个变量的值。比如:

[root@linux /]# echo $a
Hello
[root@linux /]# echo $a $b
Hello world

当变量名称容易和紧跟其后的其他字符相互混淆时,需要使用“{}”将变量括起来,否则将报错。

[root@linux /]# echo $a123            #没有找到“product1234”这个变量
[root@linux /]# echo ${a}123          #正确输出变量和字符
Hello123

变量赋值的特殊操作

1>双引号(" "):双引号主要起界定字符串的作用,特别是当要复制的内容中包含空格是,必须以双引号括起来,其他情况双引号可以省略。比如:

[root@linux /]# a=Hello world
-bash: world: command not found
[root@linux /]# a="Hello world"
[root@linux /]# echo $a
Hello world

双引号还允许通过$符号引用其他变量值,比如:

[root@linux /]# b="123 $a"
[root@linux /]# echo $b
123 Hello world

2>单引号(' '):禁止引用其他变量值,$视为普通字符,单引号中的特殊符号都将视为普通字符,比如:

[root@linux /]# c='Hello $b'
[root@linux /]# echo $c
Hello $b

3>反撇号( ):主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的内容必须是可以执行的命令,否则将出错。比如:

[root@linux /]# ls -lh `which systemctl`
-rwxr-xr-x 1 root root 623K May 26  2017 /usr/bin/systemctl

注意:使用反撇号难以子啊一行命令中实现嵌套命令替换操作,这时可以使用“$()”来替代反撇号操作,解决嵌套问题。比如:

[root@linux /]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
//查询提供useradd命令程序的软件包所安装的配置文件位置

4>大括号({}):用来分割变量和字符;如果在变量后还有其他字符,就需要使用“{}”,{}中是变量。

read命令

read命令可以使从键盘输入的内容为变量赋值,比如:

[root@linux /]# read abc
123456                   //输入给变量abc所赋的值
[root@localhost ~]# echo $abc
123456                             //查看结果 

为了使交互式操作的界面更加友好,提高易用性,read命令可以加“-p”选项来设置提示信息,以便告知用户应该输入什么内容等。比如:

[root@localhost ~]# read -p "请指定存放的目录:" abcd
请指定存放的目录:/opt/backup
[root@localhost ~]# echo $abcd
/opt/backup

设置变量的作用范围

默认情况下,新定义的变量只能在当前Shell环境中有效,因此称为局部变量;当进入子程序或者新的Shell时,局部变量将不能使用。比如:

[root@linux /]# echo "$a $b"
Hello world
[root@linux /]# /bin/sh                                 //切换一个Shell环境
sh-4.2# echo "$a $b"                            //找不到这样的变量
sh-4.2# exit                                                         //返回上一个Shell
[root@linux /]#

为了使用户定义的变量可以在所有Shell环境中继续使用,减少重复的工作,可以通过内部命令export将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无需使用“$”符),变量之间用空格分割即可!

[root@linux /]# export a b
[root@linux /]# /bin/sh
sh-4.2# echo "$a $b"
Hello world

数值变量的运算

在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。数值运算主要是通过内部命令expr进行。

常用的变量:
加法运算:+
减法运算: -
乘法运算: *
除法运算: /
求模(取余)运算: %

比如:

[root@linux /]# x=100
[root@linux /]# y=50
[root@linux /]# expr $x + $y
150
[root@linux /]# expr $x - $y
50
[root@linux /]# expr $x * $y
5000
[root@linux /]# expr $x / $y
2
[root@linux /]# expr $x % $y
0

位置变量

当执行命令行操作时,第一个字段表示命令字或脚本程序名,其余的字符串按照从左到右的顺序依次赋值给位置变量。 位置变量也称为位置参数,使用$1、$2…$8、$9表示。比如:

[root@linux /]# vim 123.sh
#!/bin/bash                                      //声明使用何种Shell
SUM=`expr $1 + $2`
echo "$1 + $2=$SUM"
[root@linux /]# chmod +x 123.sh
[root@linux /]# ./123.sh 12 34              //$1为12、$2为34时
12 + 34=46

预定义变量

预定义变量是由Bash程序预先定义好的一类特殊变量,用户不可修改,预定义变量的格式:

$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程/程序名

命令执行

在shell中执行命令通常只需要像在终端一样执行命令即可,不过,如果想要命令结果打印出来的时候,这样的方式就行不通了。因此,shell的命令方式常有:

a=`ls`  #`是左上角~键,不是单引号

或者使用$,后面括号内是执行的命令:

echo "current path is $(pwd)" 

另外,前面两种方式对于计算表达式也是行不通的,而要采取下面的方式:

echo "1+1=$((1+1))"  #打印:1+1=2

即$后面用两重括号将要计算的表达式包裹起来。

那如果要执行的命令存储在变量中呢?前面的方法都不可行了,当然括号内的内容被当成命令执行还是成立的。要使用下面的方式,例如:

a="ls"
echo "$($a)"

但是如果字符串时多条命令的时候,上面的方式又不可行了,而要采用下面的方式:

a="ls;pwd"
echo "$(eval $a)"

这是使用了eval,将a的内容都作为命令来执行。