Linux下Shell编程(二)

本文深入浅出地介绍了Shell编程的基础知识,包括特殊字符、双引号与单引号的使用、管道、文件重定向、运算符、输入与输出、比较运算、逻辑运算以及流程控制语句等内容,旨在帮助初学者掌握Shell编程的基本技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shell编程下的特殊字符

字符       说明

    $      指出shell变量名的开始

    |      把标准输出通过管道传送到下个命令

    #      标记注释开始

    &      在后台执行进程

    ?      匹配一个字符

    *      匹配一个或几个字符

    >      输出重定向操作符

    <      输入重定向操作符

 >>      输出重定向操作符{添加到文件}

    <<       跟在输入结束字符串后(HERE)操作符

    []       列出字符的范围

    [a-z]    az的全部字符

    [a,z]    意指az字符

双引号

在字符串含有嵌入的空格时,用双引号括起来。

例子:

var=teststring

newvar=Value of var is $var

echo $newvar


单引号

利用单引号把字符括起来,以阻止shell解析变量。把前面的双引号改为单引号

var=teststring

newvar='Value of var is $var

echo $newvar

执行程序可得到如下的结果:

Value of var is $var


反引号

通知 shell 执行由反引号定义的字符串。当需要把执行命令的结果存放在变量中时,就可以在 shell程序中利用反引号

string=current directory is `pwd`

echo $string

current directour is /home/huzl


管道

可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 表示。

格式:命令1 | 命令2

举例:

cat /dev/event0| hexdump

history  |grep "mv"


文件重定向

改变程序运行的输入来源和输出地点。

重定向标准输出

cat file | sort > sort.out

pwd >> path.out

echo 5 > file

echo 3 > file

echo 4 > file

重定向标准输入

sort < file

sort < name.txt  >  name.out


shell下运算符

表达式求值

$[ ] 和 $(()) 两种格式功能一样,所有的 shell 的求值都是用整数完成

echo $[2+8]  

echo $((2+8)) 

echo `expr  2+8 `

赋值运算符

=+=-=*=/=%=&=^=|=<<=>>=

var=9

let var+=1   

echo $var   结果为10

var+=1

echo $var   结果为101

整数的算术运算符 
+、-、*、/、%; 
赋值运算符 
+=、-=、*=、/=、%= 
位运算符 
<<、>>、&、|、~、^; 
位运算赋值运算符 
<<=、>>=、&=、|=、~=、^=;
逻辑运算符: 
&&,||,!,>,>=,<,<=,!=,== 
输入与输出

echo 命令可以显示文本行或变量,或者把字符串输入到文件。

read 语句可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。

read varible1 varible2 

如果只指定了一个变量,那么 read 将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车;

如果给出了多个变量,它们按顺序分别被赋予不同的变量。Shell 将用空格作为变量之间的分隔符。

键盘获取字符串

echo "enter a word "
read find_ch
echo $find_ch
文本获取字符串
#!/bin/bash
echo "welcome to start for shell language"
count=1
cat $1 | while read line
do
        echo "Line$count:$line"
        count=$[ $count +1 ]
done
echo "program end"

比较运算

1、文件比较运算符

-e filename如果 filename 存在,则为真[ -e /var/log/syslog ]

-d filename如果 filename 为目录,则为真[ -d /tmp/mydir ]

-f filename如果 filename 为常规文件,则为真[ -f /usr/bin/grep ]

-L filename如果 filename 为符号链接,则为真[ -L /usr/bin/grep ]

-r filename如果 filename 可读,则为真[ -r /var/log/syslog ]

-w filename如果 filename 可写,则为真[ -w /var/mytmp.txt ]

-x filename如果 filename 可执行,则为真[ -x /usr/bin/grep ]

2、字符串比较运算符(注意引号的使用,这是防止空格扰乱代码的好方法)

-z string如果 string 长度为零,则为真[ -z "$myvar" ]

-n string如果 string 长度非零,则为真[ -n "$myvar" ]

string1 = string2如果 string1 与 string2 相同,则为真

[ "$myvar" = "one two three" ]

string1 != string2如果 string1 与 string2 不同,则为真

[ "$myvar" != "one two three" ]

3、算术比较运算符

num1 -eq num2等于[ 3 -eq $mynum ]

num1 -ne num2不等于[ 3 -ne $mynum ]

num1 -lt num2小于[ 3 -lt $mynum ]

num1 -le num2小于或等于[ 3 -le $mynum ]

num1 -gt num2大于[ 3 -gt $mynum ]

num1 -ge num2大于或等于[ 3 -ge $mynum ]

4、测试命令

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

 test $a -eq $b && echo "a euqal b"
 [ $a -ne $b ] && echo "a not  equal b" 
 [ $a -gt $b ] && echo "a big then b" 
 [ $a -lt $b ] && echo "a less then b" 
 [ -e ./huzl.sh ] && echo "huzl.sh is exit"
 [ -x ./huzl.sh ] && echo "huzl.sh is excuate"
chmod +x huzl.sh
 [ -x ./huzl.sh ] && echo "huzl.sh(1) is excuate"

5、逻辑运算符

逻辑与: -a          格式: [ condition1 -a condition2 ]

逻辑或: -o          格式: [ condition1 -o condition2 ]

逻辑否: !           格式: [ ! condition ]

if [ $# -gt 1  -a  $# -lt 3 ] ;then
echo "the value :$#"
fi

[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok'           

ok

[root@localhost ~]# [ 2 < 1 ] && echo 'ok'                  

-bash: 2: No such file or directory

[root@localhost ~]# [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok'

ok

流程控制语句

根据某个条件的判断结果,改变程序执行的路径。可以简单的将控制结构分为分支和循环两种 。
常见分支结构:
if
case
常见循环结构:
for
while
until

if 语句

shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过“';”分割。

if 条件测试语句

then

action

[elif 条件

action

else

action

]

fi


说明:
[] 表示这段代码可选.
当条件为真(0)时执行then后面的语句,否则执行else后面的语句;
以fi作为if结构的结束


最简单的条件判断
if [ condition ];then 
    action
fi
较复杂语句
if [ $# == 1 ] ;then
	if [ -f $1 ] ; then
		echo "$1 is a file"
		if [ -x $1 ] ;then
			$1
		else
			echo "It is not x"
		fi
	else 
		if [ -d $1 ] ; then
			echo "$1 is a dir"
		else
			echo "$1 is not exit"
			echo "It will be creator"
			touch $1 
		fi
	fi

else
	echo "the val is not valid"
fi

Case语句

case选择语句使用(case/esac)

语法结构

case $arg in  

    pattern | sample) # arg in pattern or sample  

    ;;  

    pattern1) # arg in pattern1  

    ;;  

    *) #default  

    ;;  

esac 

说明:
“条件”可以是变量、表达式、shell命令等;
“模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线(|)联结 ;
一个模式要用双分号(;;)作为结束 ;
以逆序的case命令(esac)表示case分支语句的结束 

echo "================case test=============="
case $# in
	1)
		echo "the var is $1"
		;;
	2)
		echo "the var is $1 $2"
		;;
	3)
		echo "the var is $1 $2 $3"
		;;
	*)
		echo "too many vars"
		;;
esac
#!/bin/sh 

case $1 in
start | begin)
    echo "start something"  
    ;;
stop | end)
    echo "stop something"  
    ;;
*)
    echo "Ignorant"  
    ;;
esac


For循环

for 变量 [in 列表]
do
  命令(通常用到循环变量)
done
说明:
“列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值;
do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次;
如果中括号中的部分省略掉,Bash则认为是“in $@”,即执行该程序时通过命令行传给程序的所有参数的列表。 
举例
echo "================for test=============="
sum=0
for((i=0;i<10;i++ ))
do
	#echo $i
	sum=$(( $sum +$i ))
done
echo "sum = $sum"
j=0
#echo "enter a word "
#read find_ch
#for i in a b c d e f g 
#do
#	if [ $i == $find_ch ] ; then echo "find it ($j)" break 
#	fi
#	j=$(( $j+1))
#done

While循环

while/until 条件
do
命令
done
说明:
while循环中,只要条件为真,就执行do和done之间的循环命令; 
until循环中,只要条件不为真,就执行do和done之间的循环命令,
或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真;
避免生成死循环

echo "================while test=============="
sum=0
loop=$1

while [[ $loop -gt 0 ]]; do
	#statements
	echo "$loop"
	sum=$(( $sum + $loop))
	loop=$(($loop -1 ))
done
echo  "$sum"

break 和continue 语句

break 语句

用来终止重复执行的循环。break通常在进行一些处理后退出循环或case语句。如果是在一个嵌入循环里,可以指定跳出的循环个数。例如如果在两层循环内,用break 2刚好跳出整个循环。

continue语句

它不会跳出循环,只是跳过这个循环步。



函数使用

说明:
中括号中的部分可以省略;
如果在函数内部需要使用传递给函数的参数,一般用$0、$1、......、$n,以及$#、$*、$@这些特殊变量 :
$0为执行脚本的文件名;
 $1是传递给函数的第1个参数 ;
$#为传递给函数的参数个数; 
$*和$@为传递给函数的所有参数

echo "welcome to start for shell language"
func1(){
        echo "function1 test"
}

func2(){
        echo "function2 test"
        echo $1
}
func1
func2 Goodbye

函数返回值

#!/bin/bash
echo "welcome to start for shell language"
func1(){
        echo "function1 test"
}

func2(){
#       echo "function2 test"
#       echo $1
        if [ $#>=1 ] ; then
                return 1
        else
                return 0
        fi
}
echo "the func2 result is `func2 Goodbye ;echo $?`"

使用$?变量存放退出状态码,由函数中的最后一条语句决定

2return命令

#!/bin/bash

func3() {

read -p "enter a number: " value

return $[ $value + 1 ]

}

func3

echo "func3's exit status is $?"

3)使用函数输出

#!/bin/bash

func3() {

read -p "enter a number: " value

echo $[ $value + 1 ]                       echo显示值

}

result=`func3`                             将函数输出赋值给新变量

echo "new value is $result"












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值