shell脚本
1,字符串的操作
1)若打印时有空格,则应“$变量名”;
若字符串赋值时,若值中有空格,变量名 = “hello, world!”
应用双引号括起来。
2)字符串的长度
lenth=${#string}
#!bin/bash
string="hello,"
stirng1="shell!"
echo ${#stirng}
#后不是字符串表示的是字符串的长度。
3)字符串的分割
nstr=${string:a:b}
#!/bin/bash
string="hello,"
string1="shell!"
echo nstr=${string:a:b}
echo nstr1=${string1:a:b}
把字符串string从第a个之后开始截取b个字符,把值赋给新的变量
2,只读readonly
#!/bin/bash
readonly num=7
echo $num
num=66
echo $num```
打印出来会在第二次赋值时出错,两次打印结果均为7。(只读变量不可更改。)
3,清除变量的值
num=333
echo $num
unset num
echo $num```
使变量的值为空
4,注意问题
shell程序必须指定解释程序的第一行必须是:#!/bin/bash
;
赋值时等号两边不能加空格。
5,read
从键盘中获取数值
#!/bin/bash
echo "input num:"
read num
echo $num
read
:在没有输入时,则一直等待输入
read 变量1 变量2 变量3
此情况不建议使用,需要输入空格
建议使用:read 变量1
read 变量2
read 变量3
#!/bin/bash
echo "input date:year month day
read year month day
echo "press key to contine:"
read KEY
echo "the date is:$year/$month/$day"
6,shell的三大语句
说明型语句、功能型语句、结构分支语句
(1)说明型语句
以#开头的语句,至行末均为说明型语句,说明型语句不解释执行(整行),即注释;
说明型语句的位置可以是程序中的任何位置,可以放在解释执行语句之后,从#开始的部分只注释一行
(2)功能型语句
系统命令,自写程序....
(3)结构型语句
多路分支语句,循环语句,循环控制语句,测试语句,条件语句
结构型语句
7,加、减、乘、除、取余
乘法要使用转译字符
expr
let
:针对装束做简单的加、减、乘、除、取余
expr:
sum=`expr $num + $num1`
sum1=`expr $num \* $num1`
let:
let sum=num+num1
let sum1=num\*num1```
* 文件比较运算符
`-e filename`:如果filename 存在为真
`-d filename`:如果filename 为目录为真
`-f filename`:如果filename 为常规文件为真
`-L filename`:如果filename 为符号链接为真
`-r filename`:如果filename 可读为真
`-w filename`:如果filename 可写为真
`-x filename`:如果filename 可执行为真
`filename1 -nt filename2`:如果filename1比filename2新,则为真
`filename1 -ot filename2`:如果filename1比filename2新,则为真
* 整数测试
`-eq`:相等
`-ne`:不等于
`-gt`:大于
`-ge`:大于等于
`-lt`:小于
`-le`:小于等于
字符串比较:
`-z string`:string长度为零时,为真
`-n string`:string如果长度非零,为真
`string1=stirng2`
`string1!=string2`
* 逻辑操作符:
`&&`:逻辑与
`事件1 && 事件2`:当事件1和事件2都为真,则为真
`||`:逻辑与
`事件1||事件2`:当事件1或事件2为真,则为真
`-a:and`
`-o:or`
* 常见变量:
`$?`:命令执行后返回的状态,返回0表示成功执行,其他值表明执行错误
`$*`:所有参数列表
`$@`:所有参数列表
`$#`:传递到脚本的参数个数
`$0`:可执行命令本身,不是位置命令参数
`$1~$n`:分别表示第一至第n个位置的参数
`echo -n`:不换行输出!
if语句
(1)
if [ 条件 ]
then
命令
fi```
(2)
if [ 条件 ]
then
命令
elif [ 条件 ]
then
命令
else
命令
fi```
case
case 值 in
值1)
命令
;;
值2)
命令;;
值3)
命令;;
esac
for循环
for 值 in 值列表
do
命令
done
while循环
while 条件
do
命令
done
###总结及计划:
今天刚刚接触shell编程,所以许多东西还要不断琢磨,感觉shell编程以后能提高使用终端的效率,感觉还是蛮重要的,所以打算明天自习的时间好好复习,尝试使用shell编写一些简单的脚本,并且继续预习C语言高级的部分。
###作业:
1,使用while循环实现九九乘法表
!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do
for j in 1 2 3 4 5 6 7 8 9
do
sum=expr $i \* $j
printf "$j * $i = $sum "
if [ $j -eq $i ]
then
break;
fi
done
echo
done```
2,for或者while实现打印等腰三角形,行数由用户输入
#!/bin/bash
echo -n "input a num:"
read num
i=1
while [ $i -le $num ]
do
j=1
#let sum=$num-$i
while [ $j -le $(($num-$i)) ]
do
echo -n " "
let j++
done
let sum1=2*$i-1
j=1
while [ $j -le $sum1 ]
do
echo -n "*"
let j++
done
let i++
echo
做这道题出现的问题,对j的初始化位置未放置正确,导致浪费大量时间调试,主要原因:对全局变量和局部变量作用域的理解不够到位
3,写一个脚本,判断给定目录下的文件属性
#!/bin/bash
echo "Please enter a filename:"
read filename
if [ -e $filename ];then
if [ -f $filename ];then
echo "$filename is a 常规文件"
elif [ -d $filename ];then
echo "$filename is a 目录"
elif [ -L $filename ];then
echo "$filename is a 复航链接"
fi
else
echo "文件不存在"
fi```
4,预习C语言课本前三四五章,下周进入C部分的学习
已完成