shell入门基础(一)

点击这里
来源于菜鸟网站的总结

1.开头和编译
1)开头

#!/bin/bash

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
2)编译
(1)作为可执行程序

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

(2)作为解释器参数(不用在第一行指定解释器信息)

sh test.sh  //这个比较简单,方便,建议使用 

2.变量
1)命名

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

2)使用

  • 使用一个定义过的变量,只要在变量前加$符号
  • 设置只读变量 readonly

3)删除
使用unset命令(不能删除只读变量

3.字符串
单引号 双引号都可以,但是双引号可以有变量并且可以出现转义字符

1)拼接字符串

双引号和单引号都可以进行拼接

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

结果:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

2)获取字符串长度

string="abcd"
echo ${#string} #输出 4

3)提取子字符串

string="runoob is a great site"   // 这里是从下标为1的地方开始截取4个字符
cho ${string:1:4} # 输出 unoo  

4)查找子字符串

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4    // 查找i或者o的位置,哪个先出现计算哪个

补充:Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm

#号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束。

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

4.数组

1) 定义

array_name=(value0 value1 value2 value3)

2)读取

valuen=${array_name[n]}
echo ${array_name[@]}  //获取数组所有元素

3)获取数组长度

\# 取得数组元素的个数
length=${#array_name[@]}
\#或者
length=${#array_name[*]}
\# 取得数组单个元素的长度
lengthn=${#array_name[n]}

注释:可以给数组的元素传入变量,数组的下标也可以是变量
4)循环遍历数组:

#!/bin/bash
  arr=(1 2 3 4 5 6 7 8 9 10)
  for a in ${arr[*]}
  do
    echo $a
  done

5)字符串转数组

#!/bin/bash

words="aaa bbb ccc"

#字符串转数组,空格是分隔符
array=(${words// / })
#打印数组最后一个成员
echo ${array[${#array[*]}-1]}
#打印数组长度
echo ${#array[*]}

#字符串不转换为数组,在循环实现以空格为分隔符打印每个成员
for word in ${words}; do
    echo ${word}
done

5.注释
1)单行使用//或者*
2)多行

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

6.运算
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
乘号(*)前边必须加反斜杠()才能实现乘法运算;
1)算数运算符
在这里插入图片描述

2)关系运算符
在这里插入图片描述

3)布尔运算符
在这里插入图片描述

4)逻辑运算符
在这里插入图片描述

使用 [[ … ]] 条件判断结构,而不是 [ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。

5)字符串运算符
在这里插入图片描述

字符串运算符比较时也可以用==

6)文件测试运算符
在这里插入图片描述
7.echo命令

读取变量用read
read命令接收参数,输入的词组个数大于需要的,多出的会被作为一个整体
参数说明:

  • -p 输入提示文字
  • -n 输入字符长度限制(达到6位,自动结束)
  • -t 输入限时
  • -s 隐藏输入内容
read -p "请输入一段文字:" -n 6 -t 5 -s password
$ sh test.sh 
请输入一段文字:
password is asdfgh
#!/bin/sh
read name 
echo "$name It is a test"

1)显示普通字符串
2)显示转义字符
3)显示变量
4)显示换行

echo -e "OK! \n" # -e 开启转义
echo "It is a test"

结果:

OK!
It is a test

5)显示不换行

echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

结果:

OK! It is a test

6)显示结果定向至文件

echo "It is a test" > myfile

7)原样输出字符串,不转义(单引号)
8)显示命令结果

echo `date

8.printf 格式化输出

 #format-string为双引号
printf "%d %s\n" 1 "abc"

10.test命令
用于检查某个条件是否成立,数值,字符和文件三个方面的测试
1)数值测试

在这里插入图片描述

格式:

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

2)字符串测试
在这里插入图片描述

格式
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

3)文件测试
在这里插入图片描述

格式

if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

上面展示的是使用 -o(或) 逻辑操作符把两边的测试条件链接起来的情况

注意:如果if[ ];then 这种要连接在一起要用分号,如果不在一行,不需要加分号
11.流程控制

1)if-else
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

2)for循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

自己练习代码展示:

echo "Hello world!"   //  第一行代码都是hello world开始的
array=(1 2 3 4)

echo first digit is ${array[0]}
echo "first digit is ${array[0]}"    //实际上有没有分号是一样的

echo all digit are ${array[@]}
echo all digit are ${array[*]}      // @和*都表示全部数组元素

echo "数组的长度为 ${#array[@]}"  // 数组的长度

a=0
echo "第一个元素为:${array[a]}"       //数组的下标可以是变量,其实数组的元素也可以是一个变量

for i in ${array[@]};
do
  echo $i
done                               //试一下常用的for循环

:<<EOF                      //注释开头
val=`expr 2 + 2`      
echo $val                   //运算要包括到expr中,这里不是一般的单引号,是反单引号,位于Esc下方

a=4
b=5
val1=`expr $a \* $b`    //  还有其他的运算符都可以直接使用,但是称号一定要经过转义
echo $val1

if [ $a == $b ]
then echo a=b
else echo a not=b           //if这不就出来了,判断条件装在[]里,结尾一定要有fi,一直忘记
fi

a=2
b=3
val=`expr $b / $a`
echo $val                  //结果是1,我想试一下这个除法是不是自动抹掉小数点之后的

str1="abc"
str2="cde"
if [ $str1 = $str2 ]
then
echo str1=str2
else
echo str1 not=str2
fi                                //字符串比较可以使用==也可以使用=

if [ -n  "$str1" ]
then
echo lenngth is not 0
fi                                  //判断字符串是不是不为0,这个使用时字符串要有引号

if [ $a ]
then
echo kong
else
echo not kong
fi

read n
echo n                       

echo -e "OK \n"
echo it
echo -e "OK \c"
echo it

read -p "please enter:" -n 6 -s passworld                       //-n是读的长度不超过6,-s是隐藏输入,-p是输入提示信息
echo -e "\npassworld is $passworld"

num1=100
num2=200
if test $num1 -eq $num2
then echo equal
else echo not equal
fi
str1="xuejiarui"
str2="denglun"
if test $str1 = $str2
then echo deng and xue are cp
else
echo deng and xue are cp2
fi                                                                                //test的基础使用

if [ ! -d "xue" ]
then
touch xue
else
echo 文件xue已经存在
fi                                                                       //判断文件存在


if [  -d xue ];
then
echo wenjiancunzai
else
echo 文件bucunzai
fi

a=10
b=20
if [ $a ==$b ]
then
echo 相等
elif [ $a -gt $b ]
then
echo a大于b
elif [ $a -lt $b ]
then
echo a小于b
else
echo 没有符合的条件                                        // if else结构使用       
fi
EOF
string="ba ga ya lu"
for str in $string
do
echo $str
done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值