Linux shell 基础语法

本文详细介绍了Shell脚本中变量的定义与使用,包括数值型和字符串型变量,以及数组的创建与遍历。讲解了条件判断、循环语句(for、while)的应用,还涵盖了字符串截取、运算符和流程控制结构。此外,还展示了awk、grep、curl等命令的高级用法,以及如何在脚本中定义和调用函数。
摘要由CSDN通过智能技术生成

常用变量的定义

//定义变量、获取变量值(数值型)
$ a=1
$ echo ${a}
1
//定义变量、获取变量值(字符串)
$ a="hello world"
$ echo ${a}
hello world
//$?代表上一条命令返回状态:0代表true,非0代表false
$ echo $?
0
//String变量中引用其它变量,本变量要用双引号,非单引号
$ m="wanglihong"
$ n="what is your name? ${m} "
$ echo ${n}
what is your name? wanglihong
//数组定义用小括号表示
$ a=("aaaaa" "bbbbb" "cccc")
$ a=(1 2 3 4 5)
//遍历数组用法
$ echo ${a[*]}
1 2 3 4 5
//获取数组长度用法
$ echo ${#a[*]}
5
//反引号用于将linux命令返回值赋给变量接收
//字符串变量
$ a=`ls`
$ echo ${a}
Applications Library System Users Volumes bin cores dev etc home opt private sbin tmp usr var
//数组变量
$ a=(`ls`)
$ echo ${a}
Applications
$ echo ${a[*]}
Applications Library System Users Volumes bin cores dev etc home opt private sbin tmp usr var
//先执行ls命令再执行echo命令
$ echo my directiry is `ls`
//双括号是对变量进行操作,(())是整数扩展,把里面的变量当成整数处理
$ a=1;b=2
$ echo $((a+b))
3
//$(())变量表达式只能计算除数和被除数均为整数且余数为整数的除法;
//涉及小数的除法用下面的awk方式
$ awk 'BEGIN{print 2/3}'
0.666667
$ awk 'BEGIN{print 3/4}'
0.75
$ awk "BEGIN{print ${a}/${b}}"
//字符串截取(从去掉前五个开始截取,往后取4个)
$ a="This is a beautiful girl"
$ echo ${a:5}
is a beautiful girl
$ echo ${a:5:4}
is a
//获取字符串长度(变量前加#号)
$ echo ${#a}
//获取数组长度(必须加[*])
$ echo ${#a[*]}
//从头匹配第一个指定字符并截取打印后面字符串
$ a="hello from testerhome"
$ echo "${a#*o}"
 from testerhome
$ echo "${a#*from}"
 testerhome
//从头开始匹配直到匹配到最后一个指定字符并截取打印后面字符串 
$ echo "${a##*o}"
me
//从尾部开始匹配直到匹配到第一个指定的字符并截取打印前面的字符串
$ echo "${a%o*}"
hello from testerh
//从尾部开始匹配直到匹配到最后一个指定字符并截取打印前面的字符串
$ echo "${a%%o*}"
hell
//关系运算语法(注意格式:[]中空格隔开)
$ [ 3 -eq 3 ];echo $?
0
$ [ ! 3 -eq 3 ];echo $?
1
$ [ 4 -gt 3 ];echo $?
0
$ [ 4 -ge 3 ];echo $?
0
$ [ 4 -lt 3 ];echo $?
1
$ [ 4 -le 3 ];echo $?
1
$ [ 4 -le 3 -o 5 -ge 1 ];echo $?
0
$ [ 4 -le 3 -a 5 -ge 1 ];echo $?
1
//字符串替换(from替换成to)
$ echo ${a}
hello from testerhome
$ echo ${a/from/to}
hello to testerhome
//特殊格式(制表符和换行符)加-e
$ echo -e "aaaaaaa\nbbbbbbbbb"
aaaaaaa
bbbbbbbbb
$ echo -e "aaaaaaaaa\tbbbbbb"
aaaaaaaaa	bbbbbb
//判断文件是否存在
//-e:文件是否存在;-f:文件是否为普通文件;-d:文件是否是文件夹
$ [ -e jmeter.log ];echo $?
0
$ [ -f jmeter.log ];echo $?
0
$ [ -d jmeter.log ];echo $?
1

流程控制语句

#if语句
finup$ if [ 3 -gt 2 ];then echo success;else echo failure;fi
finup$ if((3>2));then echo success;else echo failure;fi
finup$ if [ ${a} -gt ${b} ];then echo successful;else echo failure;fi
finup$ if [ -e jmeter.log ];then echo "文件存在";else echo "文件不存在";fi
#for循环
$ for i in ${arr[*]};do echo ${i};done
$ for((i=0;i<${#arr[*]};i++));do echo ${i};done
$ for i in `ls`;do echo ${i};done
//下面两种方式等价
$ i=0;while((i<10));do echo ${i};((i++));done
$ i=0;while [ ${i} -lt 10 ] ;do echo ${i};((i++));done
# while循环
finup$ i=0;while [ ${i} -le 2 ];do echo ${i};((i=i+1));done
0
1
2
//while read读取文件,“<”是输出重定向;">"是输入重定向,如echo "hello world" > test.txt
finup$ while read i;do echo ${i};done <jmeter.log
//read命令读取键盘输入数据
finup$ read v;echo ${v}
finup$ read -p "enter:" v;echo ${v}
enter:44444444
44444444
# for循环与if综合:
for i in *;do echo ${i};if [ -f ${i} ];then break;fi;done
for x in *;do echo ${x};if [ -f ${x} ];then echo ${x} is a file;else continue;fi;done

shell运行环境概念

//{}代表在当前shell中运行
{ m=8;echo ${m}; };echo $m
//()代表在子shell中运行
$ (m=1;echo ${m})
//echo $$代表返回当前shell的pid,bash命令进入子shell
$ echo $$
10972
$ bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ echo $$
13182
//前者是覆盖输入;后者是追加输入
echo "hello from world!" > test.txt
echo "hello to world!" >>test.txt
//四个常见的预定义变量:linux系统提前定义好的;PATH变量中":"冒号与window环境变量中的分号";"作用相同,分隔变量
$ echo $PATH
输出: /Users/configSoftWare/apache-maven-3.6.2/bin:/usr/local/mysql/bin
$ echo $USER
输出: finup
$ echo $PWD
输出: /var
$ echo $HOME
输出: /Users/finup
//自定义创建可执行文件.sh,通过bash命令执行文件中的指令并输出
$ cat wulala
echo "hello from testerhome!"
ls -lh
$ bash wulala
hello from testerhome!
total 2
drwxr-xr-x    3 finup  staff    96B  8 25 16:01 AndroidStudioProjects
-rw-r--r--    1 finup  staff    29K  7 17  2020 AppiumProject.zip
drwx------@   3 finup  staff    96B 11  9 17:57 Applications
drwx------@  29 finup  staff   928B  1 26 10:22 Desktop
/**
grep从指定文件中匹配指定内容并打印;
"-i":忽略大小写;
"-o":精确匹配内容,不带o默认显示所在行内容;
"-v":不显示指定对象所在行
"-C2":显示指定匹配对象上下文所在行内容,默认显示上下各两行,可以为C3、C4等
"-A2":显示指定匹配对象后面两行内容(After)
"-B2":显示指定匹配对象前面两行内容(Before)
*/
$ grep -i "hello" wulala.txt 
hello to testerhome
HELLO TO TESTERHOME
$ grep -io "hello" wulala.txt 
hello
HELLO
ps -ef | grep bash | grep -v grep
cat demo.log | grep -C2 503
//其中"|"是管道符
$ cat wulala.txt | grep -i "hello"
hello to testerhome
HELLO TO TESTERHOME
//"."代表匹配任意一个字符;".*"匹配一个或多个字符
$ cat wulala.txt | grep -o "c."
$ cat wulala.txt | grep -o "c.*"
//curl高级用法,grep匹配正则表达式,*代表匹配0次或多次
$ while read x;do curl -s http://www.baidu.com/s?wd=${x};done<demo.txt | grep -o "结果约[0-9,]*"
//awk:数据切片,通过-F指定分割符对内容进行分割输出
$ echo "123|456|789"|awk -F '|' '{print $3}'
$ echo "aaaaa_bbbbbb_ccccc_dddd" | awk -F '_' '{print $4}'
$ cat passwd | awk -F ':' '{print $1}'
$ cat passwd | awk -F ':' '{print $1,$6}'     //打印出的第1列和第6列以空格隔开
 $ cat passwd | awk -F ':' '{print $1"\t"$6}' //打印出的第1列和第6列以制表符号隔开
 $ curl -s http://www.baidu.com/s?wd=mp3 | grep -o "结果约[0-9,]*" | awk -F '个|约' '{print $2}'
 //-s静默模式;-A用户代理;-b代表cookie信息
 curl -s -b "device_id=web_HyXwYokKD; channel=1141" -A "Mozilla/5.0...Safari/537.36" https://danju.com/dj
//awk输出结果去除空行使用{if(length !=0) print $0}参数
 $ curl -s https://www.jianshu.com/u/b1486d9b1588 | awk -F '<a class="title" target="_blank" href' '{print $2}' | awk -F '">' '{print $2}' | awk -F '</a>' '{print $1}' | awk '{if(length !=0) print $0}'
//sed:文本替换,+号替换成_号,以s开头,以g结尾代表全部替换,不写g只替换第1个
 $ echo "aaa+bbb+ccc" | sed 's/+/_/g'
输出:aaa_bbb_ccc
 $ sed 's/任意花api接口/蒙牛智网接口清单/g' jmeter.log    //只替换暂存区,不会更新原始文件
 $ sed -i.bak 's/任意花api接口/蒙牛智网接口清单/g' jmeter.log  //"-i"会覆盖源文件,"-i.bak"会备份原文件后缀以bak结尾,可自定义
# vim创建文件demo.bash,并填写函数如下;保存后,chmod +x demo.bash,在命令行中执行demo.bash即可执行文件中的函数
 goFunction(){
   echo "this is a testing case,please skip it"
   read -p "Enter var_a:" var_a
   read -p "Enter var_b:" var_b
   if [ ${var_a} -eq ${var_b} ]
   then
     echo "var_a等于var_b"
   elif [ ${var_a} -gt ${var_b} ]
   then
     echo "var_a大于var_b"
   else
     echo "var_a小于var_b"
   fi
}
goFunction
# awk、grep、curl、for及``的综合应用:统计网站文章列表中每篇文章里面的点赞数
a=`curl -s https://testerhome.com/topics | grep -o 'href="/topics/[0-9]*"' | awk -F '"|/' '{print $4}'`;
for id in ${a};do url='https://testerhome.com/topics/'${id};
inside=`curl -s ${url} | grep -m 1 -o '<span>[1-9][0-9]* 个赞</span>' | awk -F '<span>|</span>' '{print $2}'`;
echo 该篇文章的id为:${id},点赞数量为:${inside};done
/**
BEGIN代码块:(BEGIN后面第一个花括号)
在读取文件之前执行,且执行一次
在BEGIN代码块中,无法使用$0或其它一些特殊变量
main代码块:(BEGIN后面第二个直到END之前的花括号)
读取文件时循环执行,(默认情况)每读取一行,就执行一次main代码块
main代码块可有多个
END代码块:
在读取文件完成之后执行,且执行一次
有END代码块,必有要读取的数据(可以是标准输入)
END代码块中可以使用$0等一些特殊变量,只不过这些特殊变量保存的是最后一轮awk循环的数据
*/
$ echo -e "1|2|3\n4|5|6\n7|8|9" | awk -F '|' 'BEGIN{a=0}{a=a+$2}END{print a}'
//获取公网IP地址
curl icanhazip.com
/**
执行下面命令并输出:
$0变量读取的是demo.sh本身,
$1读取的是demo.sh之后的第一个参数;
$2读取的是demo.sh之后第二个参数;
$#代表的是demo.sh之外的参数个数;
$*代表的是传入的参数名称
第10个及以上${10}括起来,否则读取不到
*/
demo.sh a b c d e
获取脚本参数:demo.sh
获取第一个参数:a
获取第二个参数:b
获取参数个数:5
获取参数:a b c d e
获取参数:a b c d e

//demo.sh文件中定义下面参数
echo "获取脚本参数:$0"
echo "获取第一个参数:$1"
echo "获取第二个参数:$2"
echo "获取参数个数:$#"
echo "获取参数:$*"
echo "获取参数:$@"

//demo.sh文件中脚本awk引用变量要用\"${var}\"表示
 read -p "please enter number m:" m
 read -p "please enter number n:" n
 echo m+n=$((m+n))
 echo m-n=$((m-n))
echo m*n=$((m*n))
echo `awk "BEGIN{print \"$m\"/\"$n\"}"`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值