shell基础(一)语法基础、搜索、切割、替换、脚本

变量使用定义

a=1
a=`curl  -s https://testerhome.com/topics | grep  "data-prefetch" | awk -F ‘"‘ ‘{print $4}‘`#将执行结果赋值给a
  • 等号左右不能有空格
  • 如果内容有空格,需要使用引号或者上引号
  • 双引号支持转义 $开头的变量会被自动替换
  • 用{}区分引用变量
#屏幕输出a
echo $a
#屏幕输出d $a 
echo ‘d $a‘
#屏幕输出d 1 ,a被加载
echo "d $a"
#屏幕输出,不需要空格时,区分引用,用{}
echo ${a}_1

预定义变量

echo $PWD 
echo $USER
echo $HOME#主目录
echo $PATH#环境变量

数组变量

a=(1 2 3 4)#定义数组
echo ${a[@]}#屏幕打印整个数组
echo ${a[*]}#屏幕打印整个数组
echo ${#a[@]}#屏幕打印整个数组长度

which python #查找安装目录,只能查找到环境变量的里面
touch 1.sh #创建1.sh文件

a=`ls` #反引号将命令执行结果赋值给a
echo $a#输出命令执行的结果

a=(`ls`)#将命令执行结果赋值给数组a
echo ${a[*]}#屏幕打印整个数组
echo ${a[0]}#屏幕打印第一个元素

特殊符号的使用

  • 双引号用于括起一段字符串值,支持$var形式的变量替换
  • 单引号也标识起内容字符串值,不支持转义
  • \反斜线,某些情况下表示转义
  • -e开启转义
  • $(ls)标识执行ls后的结果,与``类似,不过可以嵌套
  • `翻译韩,代表命令的输出
  • $(())对变量进行操作,比如相加$((a+b)) $((2+3))
  • (())是整数扩展,吧里面的变量当做整数去处理
  • ({1..10})等价于seq 1 10.表示1到10
  • $? 上个执行语句是否成功,成功等于0
echo -e ‘123\n456‘#-e开启转义
a=4
b=6
((a<b))
echo $?#打印上个执行语句执行结果

字符串操作

s="hello frome home"
echo ${s:6}#切片,从下标6位开始输出,也就是切去前6位,输出:frome home
echo ${s:6:3}#切片,从下标6位开始输出3个,输出:fro
echo ${s#hello}#从头部去除#后面的内容,输出: frome home
echo ${s#*o}#从头部去除根据匹配项匹配的第一个之前的所有内容,包含这个匹配项一同去除。输出: frome home
echo ${s##*o}#从头部贪婪匹配,匹配最后一个匹配项,包含自己之前的内容全部去除
echo "${s%datong}"#从尾部去除#后面的内容,输出:hello from 
echo "${s%r*}"#从尾部开始去除#后面的内容,输出:hello f
echo "${s%%o*}"#从尾部贪婪匹配,匹配最后一个匹配项,包含自己之后的内容全部去除
echo "${s/o/8}"#从头部匹配第一个o,替换为8
echo "${s//o/8}"#从头部匹配全部o,替换为8

算术判断

[ 3 -eq 3 ];echo $?#判断是否相等,输出0
[ 3 -ne 3 ];echo $?#判断是否不等,输出1
[ 3 -gt 3 ];echo $?#判断是否大于等于,输出1
[ 3 -ge 3 ];echo $?#判断是否大于等于,输出0
[ 3 -lt 3 ];echo $?#判断是否小于,输出1
[ 3 -le 3 ];echo $?#判断是否小于等于,输出0
[ 3 -gt 2 -a 1 -lt 2 ];echo $?#-a相当于与
[ 3 -gt 2 -o 4 -lt 2 ];echo $?#-a相当于或
[ ! 2 -gt 1 ];echo $?#!相当于非

内置判断

  • -e file 如果文件存在,则为真
  • -d file 如果文件是一个子目录,则为真
  • -f file 如果文件是一个普通文件,则为真
  • -r file 如果文件可读,则为真
  • -s file 如果文件的长度不为0,则为真
  • -w file 如果文件可写,则为真
  • -x file 如果文件可执行,则为真
[ -e 1.sh ] #判断1.sh是否存在

IF结构

  • if [ 判断条件 ];then ...;fi
  • if [ 判断条件 ];then ...;else ...;fi
  • if [ 判断条件 ];then ...;elif [ 判断条件 ];then ...;fi
if [ 2 -gt 1 ];then echo "dadada";fi
if [ 2 -gt 3 ];then echo "dadada";else echo "sd";fi 
if [ 2 -gt 3 ];then echo "dadada";elif  [ 3 -gt 1 ];then echo "cv";fi 

For循环

for ((i=0;i<10;i++));do echo $i;done

While循环

i=0
while [ $i -lt 10 ];do echo $i;((i++));done

while read x;do echo $x;done < 1
#读取1里面的文件
#<输出重定向
#>输入重定向

退出控制

break:

for ((i=0;i<10;i++));do if [ $i -lt 3 ];then echo $i;else break;fi;done

continue:

i=0;while [ $i -lt 5 ];do if [ $i -eq 3 ];then ((i++));continue;else echo $i;fi;((i++));done

Bash运行环境

bash:开启一个子shell

exit:退出子shell

(a=1):在子shell中a赋值,完成后消亡

(a=2;echo $a);echo $a#在子shell中a赋值,完成后消亡
{ a=1;echo $a; };echo $a#在本shell中a赋值

&:将当前程序放在后台运行

sleep 5&#后台运行,等待5s
sleep 20 #ctrl+z,隐藏到后台
bg 1 #开始为1的任务
fg 1 #将后台为1的任务调到前台

环境变量

创建目录:

mkdir test#创建test文件夹
cd test/#进入test文件夹

创建文本

vim wulala.sh#创建wulala.sh文件并进入编辑模式
#按esc退出编辑模式
:w#保存,不退出vim
:wq#保存并退出
:q#不保存退出
:q!#不保存强制退出

删除文件:

rm test
rm -f test #强制删除,无需询问
rm -fr ./* #删除当前目录下所有文件
rm -f *.txt #删除目录下所有txt文件
rm -rf /var/log/httpd/access #将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
#-r 就是向下递归,不管有多少级目录,一并删除
#-f 就是直接强行删除,不作任何提示的意思

增加执行权限

chmod +x wulala.sh#增加可执行权限
bash wulala.sh #子shell执行这个文件

增加环境变量

在根目录用vim打开.bash_profile文件,添加以下内容:

export PATH=$PATH:/root/test

保存退出后,执行以下命令:

source ~/.bash_profile#重新读取文件,使其生效

重定向和追加

echo "hello world" > 1#覆盖写入1
cat 1
echo "hahaha" >> 1#追加写入1
cat 1

grep、awk、sed(搜索、切割、替换)

在文件当前目录下搜索文件内容:

grep "ma" 1.txt#匹配1.txt中带ma的内容
grep -i "ma" 1.txt# 匹配1.txt中带ma的内容,不区分大小写
cat 1.txt | grep "hi"#管道命令,匹配
cat 1.txt | grep -o "hi"#只显示匹配内容
cat 1.txt | grep -io "hi"#只显示匹配内容,不区分大小写
echo 123456789 | grep "3"
echo 123456789 | grep "3."#向后多显示1个字符
echo 123456789 | grep "3.."#向后多显示2个字符
echo 123456789 | grep "3.*"#向后显示全部字符

curl获取网页源代码----grep

curl http://www.baidu.com
curl -s http://www.baidu.com/s?wd=12306 | grep -o "结果约." #只显示结果约后面一个数字
curl -s http://www.baidu.com/s?wd=12306 | grep -o "结果约[0-9]" #只显示结果约后面一个数字
curl -s http://www.baidu.com/s?wd=12306 | grep -o "结果约[0-9,]*" #,标识或者,*标识匹配到全部
cat 1.txt | grep -o "d:[0-9,]*" | grep -o "[0-9,]*"
while read k;do echo $k;curl -s http://www.baidu.com/s?wd=$k;done<baidu.word | grep -o "结果约[0-9,]*"

awk

echo "123|456|789" | awk -F ‘|‘ ‘{print $0}‘#-F,指定以‘|‘为分隔符分割,‘{print $0}‘为指定语法。$0为全部显示

echo "123+456-789" | awk -F ‘+|-‘ ‘{print $0}‘
##此时‘+|-‘匹配+或者-。
cat passwd | awk  ‘{print $1}‘ #不用-F,默认以“ ”空格为分割
cat passwd | awk -F ‘:‘ ‘{print $1,$2}‘#以print 后面的形式输出$1和$2数据

sed

echo "hi lili hi" | sed ‘s/hi/hello/‘#只替换第一个
echo "hi lili hi" | sed ‘s/hi/hello/g‘#替换所有
sed ‘s/1/2/g‘ 1.txt#替换文件内容,但是这个原文件不变
sed -i ‘s/1/2/g‘ 1.txt#替换文件内容,改变原文件
sed -i.sd ‘s/1/2/g‘ 1.txt#替换源文件内容,且将源文件备份一个.sd文件
#BEGIN{}{}END{}用法:
#格式:awk  -F:  ‘BEGIN {处理文件前执行的代码块} {处理文件过程中执行的代码块} END {处理文件后执行的代码块}‘   filename
awk -F ":" ‘BEGIN {print "这是第一行"} {print($0)} END {print "这是最后一行"}‘ /etc/passwd

cat /etc/passwd | awk -F ":" ‘BEGIN{i=1}{print(i,$1);i++}END{print("END")}‘

脚本

创建脚本并执行

vim 1.sh#输入一下内容保存
chmod +x 1.sh#增加执行权限
1.sh 1 2 3 4 5#运行这个脚本,无法运行是因为当目录不在环境变量中,添加环境变量
echo "获取脚本执行的参数:$0";
echo "获取第一个参数:$1";
echo "获取第二个参数:$2";
echo "获取参数的个数:$#";
echo "获取到的参数(str):$*";
echo "获取到的参数(每一个参数都是一个str):$@";
echo "获取当前进程的PID:$$";

#$*和$@的区别是,$*返回的是一个整体,$@返回的是一个一个单独的

获取输入

read -p "输入:" h;echo "您输入的是$h"# read -p等待输入

创建函数脚本

functest(){
echo "第一参数为$1"
echo "第二参数为$2"
echo "第十参数为${10}"#引用9以上的参数用中括号
echo "参数总个数$#"
}

functest 1 2 3 4 5 6 7 8 9 10 11

将上述内容保存为functest.sh文件。

运行方式

  • 增加当前目录到环境变量,直接使用functest.sh
  • 使用子shell运行:bash functest.sh
  • 增加运行权限:chmod -x functest.sh 然后当前目录运行./functest.sh

练习1:打印输入数据,当输入exit,退出

functest(){
while true
do
read -p "请输入:" h;
if [ $h == "exit" ]
        then break
else
        echo "您输入的是$h"
fi
done

}

functest

练习2:打印输入2个数据的加减乘除

test(){
while true
  do
    read -p "请输入2个数字,用空格隔开" nub1 nub2
    if [ $nub1 == "exit" ]
        then break
    else
        echo "$nub1+$nub2="$(($nub1+$nub2))
        echo "$nub1-$nub2="$(($nub1-$nub2))
        echo "$nub1*$nub2="$(($nub1*$nub2))
        echo "$nub1/$nub2="`awk "BEGIN{print \"$nub1\"/\"$nub2\"}"`
    fi
  done
}
test

shell基础(一)语法基础、搜索、切割、替换、脚本

上一篇:parallel desktop ubuntu从18.04更新到20.04(包括安装Parallels Tools)


下一篇:Xmanager Power Suite 6连接Ubuntu18过程分享