shell脚本编写纪要

shell脚本后缀为.sh

+++++++++++++++++++++++
1)指定bash
首行,必须写下

#!/bin/bash

+++++++++++++++++++++++
2) 修改可执行权限

chmod 777 xxx.sh

+++++++++++++++++++++++
3)常用命令

echo "hello world"

打印字符串

read xxxstr

读取用户输入的字符串,回车结束,并将字符串赋值给变量xxxstr。

echo "please input your name :"
read name
echo "your name is : " $name

以上例子为基本的交互式输入输出。

注意,echo的参数,如果是多个字符串,则命令会自己串联多个字符串来打印。
变量引用,使用$符号,与makefile不同的是,shell是不需要括号将变量包含起来的。

read -p "input your age and height:" age height
echo "your age is $age, your height is $height "

read 可以输出提示字符串,由-p参数指定。
read一次读取多个字符串,分别赋值给变量,回车结束,多个字符串的分隔,用空格分隔。
echo中,使用了变量引用,脚本解析阶段,会进行文本替换。

read -p "input first num:" firstnum
read -p "input second num:" secondnum
total=$(($firstnum + $secondnum))
echo "total is : $total"

美元符配合双层括号,表示数值计算,首先将括号内的数字字符串,转换成int的数值,然后计算出的数值结果,再转换成数字字符串,赋值给字符串变量。
数值计算,支持加减乘除等。

注意的是,赋值操作=,两边的变量不能有分隔符,例如空格,这和C编程不同。

read -p "input test filename:" filename
test -e $filename && echo "$filename exist" || echo "$filename not exist"

test命令,使用-e选项时,用来判断文件是否存在。

&&命令,是true then execute ,如果前一个命令返回结果为TRUE,则执行,即,真续操作符。
如果执行成功,返回结果为TRUE,向下传递,
如果执行不成功,返回结果为FALSE,向下传递,
注意,如果前级命令返回结果为FALSE,则真续符显然不会执行,shell认为,这种情况,属于空执行,所以,返回结果为前级结果,即FALSE,向下传递。
即真续符,会将FALSE结果向下透传。

||命令,是 false then execute, 如果前一个命令返回结果为FALSE,则执行,即,假续操作符。
如果执行成功,返回结果为TRUE,向下传递,
如果执行不成功,返回结果为FALSE,向下传递,
注意,如果前级命令返回结果为TRUE,则假续符显然不会执行,shell认为,这种情况,属于执空执行,所以,返回结果为前级结果,即TRUE,向下传递。
即假续符,会将TRUE结果向下透传。

read -p "input first string:" firststr
read -p "input second string:" secondstr

["$firststr" == "$secondstr"] && echo "two string equal" || echo "two string not equal"

中括号[],字符串判断操作符,里面只可以使用==或者!=,
返回结果为TRUE或者FALSE。
注意的是,参与比较的两个字符串,必须分别使用双引号进行字符串格式化。

+++++++++++++++++++++++++++++++
默认变量
$0
$#
$1
$2

$N
$@
当用户在shell中输入命令行时,会被解析为多个字符串,存放到shell的字符串数组中。
其中0存放的字符串,是shell脚本的名字,这是第一个解析出的字符串,
1 存放的是名字之后的第二个字符串,
2 存放的是名字之后的第三个字符串,
以此类推,
$#存放的是最后的一个字符串的索引标号,也可以理解为参数的总数。
$@是一个重组字符串,
shell将 "$1"到 "$N"的字符串,加上分隔符,例如空格,最后串联成一个大的字符串。

++++++++++++++++++++++++++++++++++++++++++++++
条件跳转

read -p "input Y/N " value
if ["$value" == "Y"] || ["$value" == "y"]; then
	echo "your input is yes"
	exit 0
elif ["$value" == "N"] || ["$value" == "n"]; then
	echo "your input is no"
	exit 0
else
	echo "your input is other"
	exit 0
fi

注意,if的条件表达式后面,必须有分号,然后再写then。
elif的写法,和C语言不同。

case $1 in
	"a")
		echo "param is a"
		;;
	"b")
		echo "param is b"
		;;
	*)
		echo "param is not valid"
		;;
esac

注意,case 的条件表达式后面, 不加分号,不是写then,而是写in。

++++++++++++++++++++++++
自定义函数

function myfunc(){
	echo "this is my function"
}
case $1 in
	"a")
		echo "param is a"
		;;
	"m")
		myfunc
		;;
	*)
		echo "param is not valid"
		;;
esac

注意,定义函数时,只需要空括号,不添加参数列表。

+++++++++++++++++++++++++++++++++++
循环跳转

while ["$value" != "close"] 
do 
	read -p "input string" value
done
echo "stop while"

while-do-done命令块。
执行条件表达式,然后检查返回结果,为TRUE时,执行do命令块。否则escape。
在done语句时,跳转到while,再次执行条件表达式,然后检查返回结果。

until ["$value" == "close"] 
do 
	read -p "input string" value
done
echo "stop until"

until-do-done命令块。
执行条件表达式,然后检查返回结果,为FALSE时,执行do命令块。否则escape。
在done语句时,跳转到until,再次执行条件表达式,然后检查返回结果。

for var in lz1 lz2 lz3 lz4
do 
	echo "this is $var"
done

for-in-do-done命令块。
这是遍历循环体。
每次迭代,var被赋值为集合内的一个值,并执行一次do命令块。
在done语句时,跳转到for,再次对var赋值。
知道集合中的最后一个值也被赋值过了。

read -p "input count " count
total=0
for((i=0; i<=count; i=i+1))
do
	total=$(($total + $i))
done
echo "total is $total"

双层括号,强制数值运算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值