linux shell 常用语法详解

本文详细介绍Shell脚本的基础知识,包括数组操作、特殊字符解析、变量引用、运算符使用、命令执行与替换、测试命令以及控制结构如if-then、case、for循环、while循环等。通过实例展示了如何在Shell脚本中进行文件测试、数值比较和字符串测试。
摘要由CSDN通过智能技术生成

数组

## 以空格分开
IPTS=(10.0.0.1 10.0.0.2 10.23.12.01) 
## 显示数组的所有元素
echo ${IPTS[@]}
## 显示数组元素个数 (${#IPTS[@]} 不能有空格)
echo ${#IPTS[@]}
## 显示数组的第一个元素
echo ${IPTS[0]}

转义个引用

特殊字符:一个字符不仅有字面意义,还有元意(meta-meaning)
#注释·
;分号
“和’引号("" 双引号为不完全引用,引用的内容会被解析;’’ 单引号是完全引用;`` 反引号执行命令)
\转义符号:

\n\r\t单个字母的转义
\$\”\\单个非字母的转义
$ var1=123
$ echo '$var1'
# echo '$var1' 结果:$var1
$ echo "$var1"
# echo "$var1" 结果:123

$ echo "\$var1"
# 结果:$var1
$ echo "  abc"x"edf  "
# 结果:  abcedf  
$ echo "  abc\"x\"edf  "
# 结果:   abc"x"edf 

运算符

** 乘方
expr进行运算 (只支持整数运算)
双圆括号是let命令的简化
数字常量的使用方法

let“变量名=变量值"
变量值使用0开头为八进制
变量值使用0x开头为十六进制
## expr 的使用
$ expr 4 + 5
# 结果:9
$ expr 4+5
# 结果:4+5
$ expr 4 + 6 * 5 
# 结果:34


$ num1=`expr 4 + 5`
$ num2=`expr 4 +  5 `
$ echo $num1
# 结果:9
$ echo $num2
# 结果:9

$ (( a=4+5))
$ echo $a
# 结果:9
$ ((a++))
# 结果:10
$ d=4+5
$ echo $d
# 结果:4+5
$ echo $(( 5+5 ))
#结果 10

## 不可以出现 b= 4 +5 或者 b=4 + 5 等写法
$ b= 4 +5

特殊字符大全

“” 双引号为不完全引用 ,引用的内容会被解析
‘’ 单引号是完全引用
`` 反引号执行命令
() 单独使用圆括号会产生一个子shell(xyz=123)或 数组初始化IPS=(ip1ip2ip3)
(()) 双圆括号 shell中算数及赋值运算的扩展 (对应let的用法)
( ) l i n u x 中 () linux中 ()linux( )与(反引号)都是用来作命令替换的
[] 单独使用方括号是测试(test)或数组元素功能
[[]] 两个方括号表示测试表达式
<>尖括号重定向符号
{}花括号 范围生成或者输出 (例如:输出范围echo{0…9})
; 命令分隔符 (case 语句的分隔符为;;)
: 空指令
,分隔目录
~ home/家 目录
. 和source命令相同

  • 通配符
    ?条件测试或通配符
    $ 取值符号
    I 管道符
    & 后台运行
    _ 空格
## 下面相当于之执行ls命令
$ cma=$(ls)
$ echo $cma

$ [5 -gt 4]
$ echo $?
# 结果: 0
## [[ 5 > 4]]  必须要有空格
$ [[ 5 > 4]]
$ echo $?
# 结果:0

# 文件复制 将passwd 复制为passwd.bak
$ cp/etc/passwd{.bak)

$ (( 5 > 4 && 4 > 3 ))
$ echo $?
# 结果: 0   (0为真 1位假)

$ echo {1..9}
# 结果: 1 2 3 4 5 6 7 8 9
$ echo { 1..9 }
# 结果: { 1..9 }
## 顺序执行ls和pwd
$ ls;pwd

## 此处?表示通配符
$ ls ?.sh

## 上一次访问目录
$ cd -

测试命令test

test 命令用于检查文件或者比较值 (test 比较区分大小写)
test 测试语句可以简化为[]符号
[]符号还有扩展写法[]支持&&、I、<、>
test 可以做以下测试:

1 文件测试
2 整数比较测试
3 字符串测试

语法:test(选项)

选项:
-b<文件>:如果文件为一个块特殊文件,则为真;
-c<文件>:如果文件为一个字符特殊文件,则为真;
-d<文件>:如果文件为一个目录,则为真;
-e<文件>:如果文件存在,则为真;
-f<文件>:如果文件为一个普通文件,则为真;
-g<文件>:如果设置了文件的SGID位,则为真;
-G<文件>:如果文件存在且归该组所有,则为真;
-k<文件>:如果设置了文件的粘着位,则为真;
-O<文件>:如果文件存在并且归该用户所有,则为真;
-p<文件>:如果文件为一个命名管道,则为真;
-r<文件>:如果文件可读,则为真;
-s<文件>:如果文件的长度不为零,则为真;
-S<文件>:如果文件为一个套接字特殊文件,则为真;
-u<文件>:如果设置了文件的SUID位,则为真;
-w<文件>:如果文件可写,则为真;
-x<文件>:如果文件可执行,则为真。
$ test -f  /home/test.txt
$ echo $?
##  目录是否存在
$ [-d /etc/ ]
## 判断 5大于  (只有在双[]内才能使用> < = )
$ [ 5 -gt 4 ]
$ [[ 5 > 4 ]]

if test     #表达式为真
if test !   #表达式为假
test 表达式1 –a 表达式2     #两个表达式都为真
test 表达式1 –o 表达式2     #两个表达式有一个为真
test 表达式1 ! 表达式2       #条件求反

test –n 字符串    #字符串的长度非零
test –z 字符串    #字符串的长度是否为零
test 字符串1=字符串2       #字符串是否相等,若相等返回true
test 字符串1!=字符串2      #字符串是否不等,若不等反悔false

test 整数1 -eq 整数2    #整数相等
test 整数1 -ge 整数2    #整数1大于等于整数2
test 整数1 -gt 整数2    #整数1大于整数2
test 整数1 -le 整数2    #整数1小于等于整数2
test 整数1 -lt 整数2    #整数1小于整数2
test 整数1 -ne 整数2    #整数1不等于整数2

test File1 –ef File2    两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode。
test File1 –nt File2    判断文件1是否比文件2新
test File1 –ot File2    判断文件1比是否文件2旧
test –b file   #文件是否块设备文件
test –c File   #文件并且是字符设备文件
test –d File   #文件并且是目录
test –e File   #文件是否存在 (常用)
test –f File   #文件是否为正规文件 (常用)
test –g File   #文件是否是设置了组id
test –G File   #文件属于的有效组ID
test –h File   #文件是否是一个符号链接(同-L)
test –k File   #文件是否设置了Sticky bit位
test –b File   #文件存在并且是块设备文件
test –L File   #文件是否是一个符号链接(同-h)
test –o File   #文件的属于有效用户ID
test –p File   #文件是一个命名管道
test –r File   #文件是否可读
test –s File   #文件是否是非空白文件
test –t FD     #文件描述符是在一个终端打开的
test –u File   #文件存在并且设置了它的set-user-id位
test –w File   #文件是否存在并可写
test –x File   #文件属否存在并可执行

判断、循环语句

if-then

if-then语句基本用法:
if [测试条件成立] 或 命令返回值是否为0
then 执行相应命令
fi 结束

## 判断是否是root用户
$ [ $UID = 0 ]
$ [ $USER = root ]
$ echo $?

$ if  [ $UID = 0 ]
$ then  echo  " user root "
$ fi

if-then-else

if-then-else语句可以在条件不成立时也运行相应的命令
if [测试条件成立]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束

if [测试条件成立]
then 执行相应命令
elif [测试条件成立]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束

if [SUSER=root ];then 
	echo " user root "
else 
	echo " other user "
fi

if

if [测试条件成立]
then 执行相应命令
if [测试条件成立]
then 执行相应命令
fi
fi 结束

case

case 语句和select语句可以构成分支
case "$变量” in
“情况1”)
命令…;;
“情况2”)
命令…;;
* )
命令.;;
esac

在这里插入图片描述

for 循环

使用反引号或$()方式执行命令,命令的结果当作列表进行处理
for 循环的语法:

for  参数  	in	 列表
do 执行的命令
done 封闭一个循环
for i in {1..9}
do
	echo $i
	echo hello
done	
[ rootec7~] # for filename in `1s *.mp3`
>do
>	mv $filename $(basename $filename. mp3). mp4
>done

C语言的for命令

语法:
for((变量初始化;循环判断条件;变量变化))
do
循环执行的命令
done

while 循环

while test 测试是否成立
do
命令
done

while [ $a-1t 10];
do
	 ((a++);
	 echo $a;
done

until 循环

until循环与while循环相反,循环测试为假时,执行循环,为真时循环停止
while test 测试是否成立
do
命令
done

循环嵌套和 break、continue

for sc_name in /etc/profile.d/*.sh
>do
>	if [-x	$sc_name] ; then
		.$sc_name
	fi
>done
for num in {1..9};
do 
	if [ $num -eq 5] ; then 
		break;
	fi;
	echo $num;
done

使用循环处理命令行参数

命令行参数可以使用$1 $2… ${10}… $n 进行读取
$0 代表脚本名称
$* 和 $@ 代表所有位置参数
$# 代表位置参数的数量

#!/bin/bash
for pos in $*
do
	if [ "$pos" = "help" ] ; then
		echo $pos $pos
	fi
done

或者:

#!/bin/bash

while [ $# -ge 1 ]
do
	if [ "$1" = "help" ]; then
			echo $1 $1
	fi
	shift
done 
#!/bin/bash

while [ $# -ge 1 ]
do
	echo $#
	echo "do something"
	shift
done 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值