欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > linux >内容正文

linux

Linux shell 基础语法

发布时间:2025/4/17 linux 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Linux shell 基础语法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

常用变量的定义

//定义变量、获取变量值(数值型) $ 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_aread -p "Enter var_b:" var_bif [ ${var_a} -eq ${var_b} ]thenecho "var_a等于var_b"elif [ ${var_a} -gt ${var_b} ]thenecho "var_a大于var_b"elseecho "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:" mread -p "please enter number n:" necho m+n=$((m+n))echo m-n=$((m-n)) echo m*n=$((m*n)) echo `awk "BEGIN{print \"$m\"/\"$n\"}"`

总结

以上是生活随笔为你收集整理的Linux shell 基础语法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。