基本Shell脚本操作与学习

Shell 脚本(shell script),是一花括号是可选的,加不加都行种为 shell 编写的脚本程序。

所以脚本其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。

1、shell定义变量规则:

  • ​ 英文
  • ​ 数字(变量开头不能是数字)
  • ​ 下划线

注意:不能用bash的关键字,your_name=====“runoob.com” 变量名和等号之间不能有空格

变量定义时,默认都是字符串。可以不写引号。

2、使用变量

1、echo ${SHELL} --> /bin/bash 说明linux默认用bash来进行解析shell文本

编写一个helloworld.sh,最终发现执行方式有三种
1、sh helloworld.sh
2、bash helloworld.sh
3、./helloworld.sh
其中前两种是调用sh的解析器,第三种如果执行权限不够,则无法执行。   -->修改权限 chmod 744 helloworld.sh

2、使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

花括号是可选的,加不加都行。推荐给所有变量加上花括号

//只读变量:设置后无法进行修改
myUrl="https://www.google.com"
readonly myUrl

//删除变量,变量被删除后不能再次使用。unset 命令不能删除只读变量。
unset variable_name
    

3、shell字符串可以用双引号"",也可以用单引号’’

//双引号拼接比较方便
#!/bin/bash
shell_var="Jack";
shell_con="你的名字:"${shell_var}"哈!"
echo  "我知道你是"${shell_con};

字符串基本用法

//${#str} 查看字符串str的长度
str="abcde"
echo ${#str}      --5

//截取字符串
echo ${str:1:3}    --> bcd
    
//查找子字符串
查找字符r的位置    
string="runoob is a great site"
echo `expr index "${string}" r`  --> 输出 1

4、shell数组

#!/bin/bash
//数组定义,值用空格隔开
arr=(str1 str2 str3 str4)
//也可以直接设置值,下标可以不连续
arr[10]="haha"

//获取数组的长度
length=${#arr[*]}       /   length=${#arr[@]}

echo ${arr[2]}
echo ${arr[10]}

5、Shell传递参数:

文件:changeVar.sh

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第一个参数为:${1}";
echo "传递参数的个数为:${#}"
echo "传递的参数作为一个字符串显示:$*";

使用步骤:在控制台输入:sh changeVar.sh 3 2 1, 即将三个参数传入对应的$1 ;$0为执行的文件名

6、shell基本运算符

算术运算符:  
a、val=`expr 2 + 2`   ```英文输入法模式下,按1左边的~  表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2  ; val=xxx这里的=两边不能有空格
b、num=`expr 2 \* 2`;  乘号,除号(*  /)前边必须加反斜杠(\)才能实现乘法运算;还不能是小数
c、可以用$[a+b]   计算简单的运算 sum2=$[num1*num2]    加减乘除都可以,无需转义符,可以有空格
关系运算符:
-eq  /  -ne  /  -gt  /  -lt  /  -ge  /  -le
[ $a == $b ] 返回 false。  不能直接打印出来,可以用于if判断  记着要有空格。
布尔运算符:	!非   /   -o或   /    -a与                  :[ $a -lt 20 -o $b -gt 100 ] 返回 true。
逻辑运算符: &&     ||  
    
    if [[ ${num1} -eq ${num2} &&  ${a} -eq ${b} ]]
 ==
    if [ ${num1} -eq ${num2} -a  ${a} -eq ${b} ]
 ==
    if test ${num1} -eq ${num2} -a  ${a} -eq ${b}

    
字符串运算符: 
    =          检测两个字符串是否相等
    !=
    -z         检测字符串长度是否为0,为0返回 true-n         检测字符串长度是否不为 0,不为 0 返回 true。
    $          检测字符串是否为空,不为空返回 true[ $a ] 返回 true。
    
文件测试运算符:
	if [ -e ${filePath} ]    判断文件是否存在
    if [ -r ${filePath} ]    判断文件是否可读r   写w   执行x    
    if [ -f ${filePath} ]    判断是否是文件
    if [ -d ${filePath} ]    判断是否是文件夹

        

7、echo输出

echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
    
echo "\"It is a test\""    --"It is a test"
//显示结果定向至文件,文件不存在会进行创建
echo "It is a test" > myfile
//显示时间
echo `date`;      -->   Wed Jun 10 17:06:21 2020

8、printf打印命令

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

在这里插入图片描述

%s %c %d %f都是格式替代符

%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中.2指保留2位小数。

9、shell的test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

数值测试:

-eq  /  -ne  /  -gt  /  -ge  /  -lt  /  -le
    
num1=100
num2=100
if test $[num1] -eq $[num2]           ===========     if [ $[num1] -eq $[num2] ]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

字符串测试

=  /  !=  /  -z 字符串:字符串的长度为零则为真   / -n 字符串的长度不为零则为真
    
    
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

文件测试

参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

10、shell的流程控制

//if循环
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi
//for循环
for value in 1 2 3 4 5                                     ${@}多用于此场景
do
    echo "The value is: ${value}"
done

    
    
for i in ${@}
do
  echo "喜欢${i}"
done

echo "======================="
for i in "${*}"
do 
 echo 喜欢${i}
done
---------------->>>>>喜欢2 3 4 2 21 f
    
    
    
==============================================================    
sum=0
for ((i=1;i<=100;i++))
do
    sum=$[${sum}+${i}]
done
echo "sum = ${sum}"

//while循环
#!/bin/bash
value=1
while(test $value -le 5 )
do
    echo "${value}"
    let value++          //let命令
done
    
    
    
let a=5+4
let b=9-3 
echo $a $b
//case 
echo "请输入一个数字(1-7):"
read week
case ${week} in
    "1")
        echo "星期一"
        ;;
    "2")
        echo "星期二";;
     *)
        echo "其他!!!";;
esac

11、read读取控制台输入的值

echo '按下 <CTRL-D> 退出'
echo -n '输入第一个数字: '
read num1
echo -n '输入第二个数字: '
read num2
sum=`expr ${num1} + ${num2}`
echo "sum = ${sum}"
 
==========================================================================
//  -t  限制时间    -p  提示信息    name 接收的字段名称    
#!/bin/bash
read -t 7 -p "请在7秒内输入一个字符串作为姓名:" name
echo "输入的姓名为:${name}"    

12、shell中的函数

echo "======shell函数编写======"
function printDemo(){
	echo "printDemo被调用了。。。";
}

function sumFunc(){
	#echo ${num1}           函数内部的变量不要和外部冲突了
	echo "请输入第一个数字:"
	read number1;
	echo "请输入第二个数字:"
	read number2;
	
	echo "number1=${number1}"
	echo "number2=${number2}"
	res=$[ number1 + number2 ];
	echo "函数内部输出结果:"${res};
	printDemo
	return ${res};
}
echo "函数调用前。。";
sumFunc;
echo "输入的两个数字之和为 ${?} "
echo "函数调用后。。";

要先定义,后调用。即定义写在上面。

函数的返回值需要用 $? 获取。

13、shell输入到外部

//把输出的这句话打印到introduce.txt文档中
$ echo “我是Jack” > introduce.txt
    
//将结果追加到文件中    
$ echo “我是Jack” > introduce.txt

输入到内部

将查到的结果保存到b.txt文件中
wc -l < introduce.txt > b.txt  替换
wc -l < introduce.txt >> b.txt 追加

再学习

export引出全局变量 不要在shell文件里写,直接在控制台上写 test=2173271 export test

${n} 输入的参数

${*} 获取所有的参数,把参数看成了一个整体

${@} 获取的所有参数,一个一个进行展示

${?} 判断上一个脚本是否正常执行 0表示正常; 其他不正常

[ condition ]
-eq   ==
-ne   !=
-gt   >
-lt   <
-ge   >=
-le   <=

======文件======
-r    是否可读
-w	  是否可写
-x    是否可执行

-e    是否存在
-f    是否是文件
-d    是否是目录

函数:

#  获取一个全路径文件的文件名称
basename /temp/shelllearning/mult.sh                ---》》》  mult.sh
basename /temp/shelllearning/mult.sh  .sh           ---》》》  mult
#  获取前面的文件路径
dirname /temp/shelllearning/mult.sh                 ---》》》/temp/shelllearning

自定义函数:

#!/bin/bash
function doSum(){
 sum1=$[${1}+${2}]
 echo ${sum1}
}

read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2

doSum ${num1} ${num2}

Shell工具

1、cut

# cut是切文件的  , -f指定第几列 , -d指定按什么格式切,默认是制表符Tab
cut cutdemo.txt -f 1 -d " "
cut cutdemo.txt -f 1 -d " " | grep hena
eg:  要想切出${PATH}的第一个冒号:后的所有内容
/usr/local/tools/jdk/jdk1.7.0_71/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
echo ${PATH} | cut -d ":" -f 2- 即可

从ifconfg中切割出我们想要的ip地址:多次切割
ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1 

2、sed流编辑器

可以将文件中某一行删除或者插入,放入缓冲区中,文件未改变

3、awk编辑器,也是切割文件,相对较方便

4、sort排序

sort -t : -nrk 2 sort.sh     #  把文件以:分割,按第二列以数字倒序排列

常用命令:

whatis ls(xxxxxx)
xxxxx | less一点一点显示
head tail
find / name *.log
date当前时间
cat a.txt b.txt > merge.txt将a和b合并到merge.txt中
cal日历
top相当于任务管理器
rm -r删除文件夹
cd -回到上一次的目录(返回)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值