欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SHELL基础知识点整理

程序员文章站 2024-02-19 14:52:40
...

SHELL

一、基本概念:

1. #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行

2. echo命令用于向窗口输出文本

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

二、Shell变量

1.定义变量时,变量名不加美元符号,变量名和等号之间不能有空格

命名规则和其他语言的语法一致

2.使用变量–使用定义过的变量只需要在变量名之前加美元符号即可

2.1 变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界

3.只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值是不可改变的
#!/bin/bash
url="www.baidu.com"
readonly url
url="www.baidu.com"

process result:
/bin/sh: NAME: This variable is readonly.

4.删除变量:unset

变量被删除后不能再次使用且不能删除只读变量
#!/bin/bash

#只读变量
url="www.baidu.com"
readonly url
url="www.baidu.com"

process result:
/bin/sh: NAME: This variable is readonly.

#删除变量
myurl="www.baidu.com"
unset myurl
echo $myurl

#单引号和双引号的使用
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

5.shell字符串

5.1单引号–单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号子串中不能出现单独的一个单引号,但是可以成对出现,作为字符串的拼接使用

5.2双引号可以有变量,且可以出现转义字符;

5.3获取字符串长度

5.4提取子字符串

5.5查找子字符串

#!/bin/shell
#获取字符串长度
string="abcd"
echo ${#string} #输出 4

#提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

#查找子字符串
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

6.数组

  1. bash支持一维数组且没有限定数组的大小

  2. 在shell中用括号代码那数组,元素之间用 空格符号分隔开:数组名=(值1 值2 … 值n)

#!/bin/bash
#读取数组
array_name=(1 33 44 55 66)

valuen=${array_name[n]}
echo ${array_name[@]} #@符号可以获取数组中所有元素

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


#这个是注释也是单行注释
:<<!
这是多行注释
!

三、传递参数

  1. 传递参数的几个特殊字符

    参数处理 说明
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    [email protected] ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" 使"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  2. 实际代码

    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    echo "Shell 传递参数实例!";
    echo "第一个参数为:$1";
    
    echo "参数个数为:$#";
    echo "传递的参数作为一个字符串显示:$*";
    
    #区分 $* and [email protected]
    echo "-- \$* 演示 ---"
    for i in "$*"; do
        echo $i
    done
    
    echo "-- \[email protected] 演示 ---"
    for i in "[email protected]"; do
        echo $i
    done
    

四、基本运算符

  1. shell数组可以存放多个值,数组元素的下标由0开始的,且元素之间使用空格符号分割

  2. 例如,两个数相加(注意使用的是反引号 *`* 而不是单引号 *’*):

  3. 算术题运算符

    运算符 说明 举例
    + 加法 expr $a + $b 结果为 30。
    - 减法 expr $a - $b 结果为 -10。
    * 乘法 expr $a \* $b 结果为 200。
    / 除法 expr $b / $a 结果为 2。
    % 取余 expr $b % $a 结果为 0。
    = 赋值 a=$b 将把变量 b 的值赋给 a。
    == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
    != 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
  4. 关系运算符

    运算符 说明 举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
  5. 布尔运算符

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
    -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
  6. 逻辑运算符

    运算符 说明 举例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
  7. 字符串运算符

    运算符 说明 举例
    = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
    != 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    -n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。
    $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
  8. 文件测试运算符

    操作符 说明 举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
  9. 相关代码

    #!/bin/bash
    val=`expr 2 + 2`
    echo "两数之和为 : $val"
    #乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
    value= `expr $a \* $b`
    echo "$value"
    a=10
    b=20
    #关系运算符
    if [ $a -eq $b ]
    then
    	echo "a equal b"
    else
    	echo "a not equal b"
    fi
    
    #布尔运算符
    if [ $a != $b ]
    then
    	echo " a not euqal b"
    else
    	echo "a equal b"
    fi
    
    #逻辑运算符
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
    	echo "返回true"
    else
    	echo "返回false"
    fi
    #字符串运算符
    aa="abc
    bb="abb"
    if [ $aa ]
    then
    	echo "字符串不为空"
    else
    	echo "字符串为空"
    fi
    if [ -z $a ]
    then
    	echo "字符串长度是否为0"
    else
    	echo "字符串长度不为0"
    fi
    #文件测试运算符
    file="/var/www/runoob/test.sh"
    if [ -r $file ]
    then
       echo "文件可读"
    else
       echo "文件不可读"
    fi
    if [ -w $file ]
    then
       echo "文件可写"
    else
       echo "文件不可写"
    fi
    

五、shell echo命令

  1. echo command use to input string

    #显示普通字符串
    echo "this is a string"
    #显示转义字符串
    echo "\"it is a test"\"
    #显示变量
    #!/bin/bash
    read name
    echo "$name it is a test"
    #显示换行
    echo -e "ok! \n" #-e开启转义
    echo "显示换行"
    #显示不换行
    echo -e "OK! \c" # -e 开启转义 \c 不换行
    echo "It is a test"
    
    #显示结果定向文件
    echo "It is a test" > myfile
    
    #原样输出字符串,不进行转义或者去变量
    echo '$name\"'
    
    #显示命令执行结果
    echo `date` #结果是显示当前日期
    
    

六、Shell printf 命令

  1. printf 命令的语法:printf format-string [arguments…]

    1. 参数说明:
      • format-string: 为格式控制字符串
      • arguments: 为参数列表。
  2. printf 的转义序列

    序列 说明
    \a 警告字符,通常为ASCII的BEL字符
    \b 后退
    \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
    \f 换页(formfeed)
    \n 换行
    \r 回车(Carriage return)
    \t 水平制表符
    \v 垂直制表符
    \ 一个字面上的反斜杠字符
    \ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
    \0ddd 表示1到3位的八进制值字符

七、Shell 循环控制

  1. if 语句

    if condition
    then
    	command1
    	command2
    fi
    
  2. if else 语句

    if condition
    then
    	command1
    elif condition2
    then
    	command2
    else
    	command3  
    fi
    
  3. if else - if else语句

    if condition1
    then
    	command1
    elif condition2
    then
    	command2
    else
    	commandN	
    fi
    
  4. for loop

    1. in 列表中可以包含替换 字符串 和文件名

    2. in列表是可选的如果不用,for循环使用命令行的位置参数

    for var in item1 item2....
    do 
    	command1
    	command2
    done
    
  5. while 语句

    while condition
    do
    	command
    done
    
#!/bin/bash
#流程控制
#适用于终端命令提示符
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

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
echo "==================="

#结合test的用法
if test $[num1] -eq $[num2]
then
	echo "两个数字相等!"
else
	echo "两个数字不相等!"
	
fi
#forloop
for((i=1;i<=5;i++));do
	echo "这是第 $i 次调用";
done;


for loop in 1 2 3 4 5
do
	echo "the value is:$loop"
done

#顺序输出字符串中的字符

for str in this is string
do
	echo $str
done

#while语句--循环用于不断执行系列命令
int =1
while(( $int<=5 ))
do
	echo $int
	let "int++"
done

echo -n '输入你最喜欢的网站名:'
while read films
do
	echo "yeah! $films is a good website"
done

#case easc
echo '输入1到4之间的数字:'
echo '你输入的数字为:'
read num
case $num in
	1) echo '这是1'
	;;
	2) echo '这是2'
	;;
	3) echo '这是3'
	;;
	4) echo '这是4'
	;;
	*) echo '你没有输入1到4之间的数字'
	;;
esac

site="runoob"

case "$site" in
   "runoob") echo "菜鸟教程"
   ;;
   "google") echo "Google 搜索"
   ;;
   "taobao") echo "淘宝网"
   ;;
esac



#continue&break
while :
do
	echo -n "输入1-5之间的数字"
	read num
	case $num in
		1|2|3|4|5) echo "输入数字为$num!"
		;;
		*) echo "你输入的数字不是1到5之间的游戏结束"
			break
		;;
	esac
done

		

shell函数

  1. linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

    1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

    2. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

  2. 定义一个带有return语句的函数

    1. 通过 $? 来获取到 return的返回值

  3. 函数参数:调用函数时可以向其传递参数,在函数体内部可以通过$n形式来获取参数的值

    注意事项:

    参数处理 说明
    $# 传递到脚本或函数的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    [email protected] 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

相关代码:

#!/bin/bash
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"


#带有return语句的函数
func_return(){
	echo "这个函数会对输入的两个数字进行相加运算"
	echo "输入第一个数字"
	read num
	echo "输入第二个数字"
	read another_num
	echo "两个数字分别为 $num and $another_num !"
	return $($num+$another_num)
	
}
func_return
echo "输入两个数字之和为$? !"

# 函数参数
#在shel中调用函数时可以向其传递参数 ,在函数体内部,通过$n的形式来获取参数的值

param_func(){
	echo "第一个参数为$1"
	echo "第二个参数为$2"
	echo "第三个参数为$3"
	echo "参数总个数为 $# 个!"
	echo "作为一个字符串输出所有参数 $* "
}
param_func 4 5 6

相关标签: Linux