【笔记】shell基本使用

发布于:2024-10-10 ⋅ 阅读:(156) ⋅ 点赞:(0)

一、shell的执行

1、执行命令但不输出结果到命令行

[root@localhost ~]$ command >/dev/null

2、多命令顺序执行

命令 1;命令 2 #顺序执行命令,命令间无逻辑关联
命令 1&&命令 2 #命令1正确执行才执行命令2,否则不执行
命令 1||命令 2 #命令1不正确执行才执行命令2,否则不执行

3、执行shell的命令

[root@localhost ~]$ chmod u+x test.sh
[root@localhost ~]$ ./test.sh

[root@localhost ~]$ bash test.sh

二、shell变量

1、shell变量名称定义规则:

  • 命名只能使用英文字母、数字、下划线,不能以数字开头
  • 等号前后不能包含空格
  • 环境变量一般使用大写
  • 单引号内都是普通字符
  • 双引号内可以实现转义、且有些字符有特殊含义,如"$"有调用变量的值的含义
[root@localhost ~]$ a=1
[root@localhost ~]$ a="$a"2
[root@localhost ~]$ echo $a
12
#叠加变量a
[root@localhost ~]$ a=${a}3
[root@localhost ~]$ echo $a
123
#再叠加变量a
  • 双引号内可以实现转义、且有些字符有特殊含义,如"$",可以用来调用命令

单引号、双引号、反引号用法

-反引号用法:反引号括起来的内容是系统命令,在Bash中会先执行它

[root@localhost ~]$ name=wulei
#定义变量name 的值是wulei
[root@localhost ~]$ echo '$name'
$name
#如果输出时使用单引号,则$name原封不动的输出
[root@localhost ~]$ echo "$name"
wulei
#如果输出时使用双引号,则会输出变量name的值 wulei
[root@localhost ~]$ echo `date`
2018年10月21日星期一18:16:33 CST
#反引号括起来的命令会正常执行
[root@localhost ~]$ echo '`date`'
`date`
#但是如果反引号命令被单引号括起来,那么这个命令不会执行,―date会被当成普通字符输出
[root@localhost ~]$ echo "`date`"
2018年10月21日星期一18:14:21 CST
#如果是双引号括起来,那么这个命令又会正常执行
[root@localhost ~]$ echo ls
ls
#如果命令不用反引号包含,命令不会执行,而是直接输出
[root@localhost ~]$ echo `ls`
anaconda-ks.cfginstall.loginstall.log.syslog sh test testfile
#只有用反引号包括命令,这个命令才会执行
[root@localhost ~]$ echo $(date)
2018年10月21日星期一18:25:09 CST
#使用$(命令)的方式也是可以的

#在shell脚本中使用Linux命令,也需要使用$()或者``包裹命令,例如
num=$(cat /etc/passwd | grep $username | wc -l)
numt=`cat /etc/passwd | grep $username | wc -l`

位置参数变量

位置参数变量 作用
$n n为数字,$0表示当前 Shell 脚本程序的名称,$1-9 代表第一到第九个参数 , 十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}
$* 这个变量代表命令行中所有的参数,$把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

$*会把接收的所有参数当成一个整体对待,而$@则会区分对待接收到的所有参数。举个例子:

[root@localhost sh]$ vi parameter2.sh
#!/bin/bash
for i in"$*"
#定义for循环,in后面有几个值,for会循环多少次,注意“$*”要用双引号括起来
#每次循环会把in后面的值赋予变量i
#Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
	do
		echo "The parameters is: $i"
		#打印变量$i的值
	done
## 带参数输入:sh parameter2.sh 1 2 3 5
## 输出结果:The parameters is: 1 2 3 5

x=1
#定义变量x的值为1,用于跟踪参数的索引
for y in"$@"
#同样in后面的有几个值,for循环几次,每次都把值赋予变量y
#可是Shel1中把“$@”中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
	do
		echo "The parameter$x is: $y"
		#输出变量y的值
		x=$((x +1))
		#然变量x每次循环都加1,为了输出时看的更清楚
	done
## 带参数输入:sh parameter2.sh 1 2 3 5
## 输出结果:The parameters is: 1
# The parameters is: 2
# The parameters is: 3
# The parameters is: 5

x=1
for y in"$#"
#同样in后面的有几个值,for循环几次,每次都把值赋予变量y
	do
		echo "The parameter$x is: $y"
		#输出变量y的个数
	done
## 带参数输入:sh parameter2.sh 1 2 3 5
## 输出结果:The parameters1 is: 4

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/w918589859/article/details/108752592

三、read交互式输入

用法:

read [-t 输出后等待时间 ] [-p 提示语 ] [-s (隐藏输入)] [-n 输入参数数量校验(若不符合则输入无效) ]  

举例:

read -s -t 10 -p "your age is :" age
echo $age
echo -e "\n"      #-e表示输出转义字符

四、运算符

算数运算符

用法:

`expr $a + $b `
`expr $a - $b `
`expr $a \* $b `
`expr $a / $b `
`expr $a % $b `    #取余
[ $a == $b ]      #判断两数值是否相等,注意前后空格及花括号,返回布尔值
[ $a != $b ]      #判断两数值是否不相等,注意前后空格及花括号,返回布尔值

关系运算符

对象:数字

-eq equal 相等
-ne not equal 不相等
-gt great than 大于
-lt less than 小于
-ge great than or equal 大于等于
-le less than or equal 小于等于
# 均返回布尔值

逻辑运算符

! 非运算
-o 或运算
-a 与运算
# 均返回布尔值

字符串运算符

= 相等
!= 不相等
-z 字符串长度为0,用法[ -z $a ]
-n 字符串长度不为0,用法[ -n $a ]
str 字符串不为空,用法[ $a ]
# 均返回布尔值

文件测试运算符

用于校验文件属性

-b file 是块设备文件,用法[ -b $file ]
-c file 是字符设备文件,用法[ -c $file ]
-d file 是目录,用法[ -d $file ]
-f file 是普通文件,用法[ -f $file ]
-r file 文件可读,用法[ -r $file ]
-w file 文件可写,用法[ -w $file ]
-x file 文件可执行,用法[ -x $file ]
-s file 文件大小是否为0,用法[ -s $file ]
-e file 文件是否存在,用法[ -e $file ]
# 均返回布尔值

-e举例:

[root@localhost ~]$ vi mk_dir.sh
#!/bin/bash
#创建目录,判断是否存在,存在就结束,反之创建
DIR="/tmp/dir"
if [ ! -e $DIR ]
then
	mkdir -p $DIR
fi
echo "$DIR 创建成功"

五、流程控制

if条件语句

单分支语法:

if [ 条件语句 ]
    then
        ...
fi

双分支语法:

if [ 条件语句 ]
    then
        ...
    else
        ...
fi

多分支语法:

if [ 条件语句 ]
    then
        ...
elif [ 条件语句 ]
    then
        ...
else        
        ...
fi

case多分支语句

当只有一种条件关系且与多级时可以使用case语句

case $变量名 in
	"值1")
	    ...
	    ;; ##每个条件分支必须以;;结尾
	"值2")
	    ...
	    ;;
	"值3")
	    ...
	    ;;
	*)  ## 如果以上都不符合,则执行这个分支
	    ...
	    ;;
esac  #以esac结尾
	

for循环语句

for  变量 in 值1 值2 值3 值4 ...(可以是一个文件)
    do
       ...
    done

举例:

[root@localhost ~]$ vi sh/auto-tar. sh
#!/bin/bash
#批量解压缩脚本

cd/lamp
#进入压缩包目录
ls *.tar.gz > ls.log
#把所有.tar.gz结尾的文件的文件覆盖到ls.log 临时文件中
for i in $(cat ls.log) `
#或者这样写for i in `cat ls.log`

#读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量i
	do
		tar -zxf $i &>/dev/null
		#加压缩,并把所有输出都丢弃
	done
rm -rf /lamp/ls.log
#删除临时文件ls.log

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        
原文链接:https://blog.csdn.net/w918589859/article/details/108752592
for  变量 in ((初始值;循环控制条件;变量变化))
    do
       ...
    done

举例:

[root@localhost ~]$ vi sh/add. sh
#!/bin/bash
#从1加到100

s=0
for (( i=1;i<=100;i=i+1 ))
#定义循环100 次
do
	s=$(( $s+$i ))  #注意这里是算术运算,因此需要2组小括号,
	#每次循环给变量s赋值
	done
echo "The sum of 1+2+...+100 is : $s"
#输出1加到100的和

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        
原文链接:https://blog.csdn.net/w918589859/article/details/108752592

while循环语句

while [ 条件判断语句 ]
    do 
        ...
    done

exit、break、conti

  1. exit:直接退出整个程序,可以自定义返回值,如exit 10
  2. break:退出所在循环语句,继续直接程序后续语句
  3. continue:退出本次循环,不执行循环内后面的语句,进入下一次循环

六、函数

function 函数名(){
    ...
}

举例:

#!/bin/bash
function add(){
    s=$(($a+10))
	echo $s
}
read -p "请输入原始数据:" a
add $a

七、字符截取、替换和处理命令

正则表达式

字符 描述 示例
. 匹配一个任意字符 a.b可以匹配a1b、aab等
^ 匹配以指定字符串开头字符串 ^ab可以匹配abc,不能匹配aab
$ 匹配以指定字符串结尾字符串 ab$可以匹配aab,不能匹配abc
[] 匹配括号中的任意一个字符 [abc]d可以匹配ad、bd、cd
[^] 匹配^字符之外的任意一个字符 [^abc]d不能匹配ad,能匹配kd
[-] 匹配指定范围内的任意一个字符,需要顺序递增 [0-9][a-f][A-F]可以匹配一位十六进制数据
? 匹配?之前的单元1次或0次 a?k可以匹配ak、k,不能匹配aak
* 匹配*之前的单元0次或多次 g*可以匹配ggoo
+ 匹配+之前的单元1次或多次
{N} 匹配{}之前的单元N次 [1-9][0-9]{2}匹配从100-999的整数
{N,} 匹配{}之前的单元至少N次 [1-9][0-9]{2,}匹配大于100的整数
{,M} 匹配{}之前的单元至多M次 [1-9]{,1}等价于[1-9]?
{N,M} 匹配{}之前的单元至少N次,至多M次 [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}可以匹配IP地址
| 连接2个子表达式,表示或的关系 n(o e)可以匹配no和ne

grep 中使用正则表达式

  1. egrep等价于grep -e,表示采用extended正则表达式语法
  2. grep表示采用basic语法
  3. fgrep等价于grep -F,表示只搜索指定字符串不搜索正则表达式,不按正则表达式语法解释
  4. extended规范下正则表达式需要使用单引号’ '表示,否则可能会被shell解释器解释成其他含义,且?+{}()|不需要加转移字符\,如果使用basic规范,?+{}()|需要加转移字符\才能表达为正则表达式

sed中使用正则表达式

sed支持使用特殊元字符进行查找和替换,sed -n ‘/^mmm/p’ file1可以查找file1文件中以mmm开头字符串

cut字符截取

cut用法:
cut [选项] 文件名
参数:
-f 列号
-d 分隔符,默认分隔符是制表符tab
-n 取消分割多字节字符
-c 字符范围
cut -d "%" -f 1  #以%作为分隔符分隔数据,并取出第一个数

网站公告

今日签到

点亮在社区的每一天
去签到