【笔记】shell基本使用

一、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`

位置参数变量

位置参数变量作用
$nn为数字,$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
cut用法:
cut -d "%" -f 1  #以%作为分隔符分隔数据,并取出第一个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值