Shell编程快速入门指南
原文地址:https://juejin.im/post/5a5caaf8f265da3e393a6835#heading-2
#!/bin/bash
echo "hello, world"
复制代码
运行程序可以作为解释器参数或者作为可执行程序
bash test.sh
复制代码
chmod +x test.sh
test.sh
复制代码
命名
name="huruji"
复制代码
需要注意的是变量名与等号之间不能有空格。
使用
echo $name
echo ${name}
复制代码
使用在变量名前添加$即可,{}表示这个变量名的边界。
只读变量
name="huruji"
readonly name
复制代码
使用readonly可以将变量定义为只读变量,只读变量不能再次赋值
删除变量
name="huruji"
unset name
复制代码
使用unset删除变量,之后不能再使用。
name="huruji"
echo "my name is $name"
复制代码
字符串可以使用单引号和双引号,单引号中不能包含单引号,即使转义单引号也不次那个,双引号则可以,双引号也可以使用字符串。
拼接
name="huruji"
hello="my name is ${name}"
复制代码
获取字符串长度
str="huruji"
echo ${#str} #6
复制代码
提取子字符串
str="huruji"
echo ${str:2:3}
复制代码
从字符串的第二个字符开始提取3个字符,输出ruj
查找
str="huruji"
echo `expr index "$str" u`
复制代码
此时输出2,因为此时第一个字符位置从1开始
定义
names=("huruji" "greywind" "xie")
echo ${names[0]}
echo ${names[2]}
复制代码
读取
echo ${names[2]}
echo ${names[@]}
复制代码
如上例子,使用@可以获取数组中的所有元素
获取长度
length=${#names[@]}
length=${#names[*]}
复制代码
执行Shell脚本的时候,可以向脚本传递参数,在Shell中获取这些参数的格式为$n,即$1,$2.......,
echo "第一个参数是:$1"
echo "第一个参数是:$2"
echo "第一个参数是:$3"
复制代码
运行
chmod +x test.sh
test.sh 12 13 14
复制代码
则此时输出:
第一个参数是:12
第一个参数是:13
第一个参数是:14
复制代码
此外,还有其他几个特殊字符来处理参数
算数运算 原生bash不支持简单的数学运算,可以借助于其他命令来完成,例如awk和expr,其中expr最常用。expr是一款表达式计算工具,使用它能完成表达式的求值操作。
val=`expr 2 + 2`
echo $val
复制代码
需要注意的是运算符两边需要空格,且使用的是反引号。 算术运算符包括:+ - × / % = == !=
关系运算 关系运算只支持数字,不支持字符串,除非字符串的值是数字。
a=12
b=13
if [ $a -eq $b ]
then
echo "相等"
else
echo "不等"
fi
复制代码
布尔运算
逻辑运算符
字符串运算符
文件测试运算符 用于检测Unix文件的各种属性。
file="/home/greywind/Desktop/learnShell/test.sh"
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
if [ -r $file ]
then
echo "可读"
else
echo "不可读"
fi
if [ -w $file ]
then
echo "可写"
else
echo "不可写"
fi
if [ -x $file ]
then
echo "可执行"
else
echo "不可执行"
fi
if [ -d $file ]
then
echo "是目录"
else
echo "不是目录"
fi
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
复制代码
echo在显示输出的时候可以省略双引号,使用read命令可以从标准输入中读取一行并赋值给变量
read name
echo your name is $name
复制代码
换行使用转义\n,不换行使用\c 此外使用 > 可以将echo结果写入指定文件,这个文件不存在会自动创建
echo "it is a test" > "/home/greywind/Desktop/learnShell/hello"
复制代码
使用反引号可以显示命令执行的结果,如date、history、pwd
echo `pwd`
echo `date`
复制代码
Shell中的输出命令printf类似于C语言中的printf(), 语法格式:
printf format-string [arguments...]
复制代码
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
复制代码
test命令用于检查某个条件是否成立,可以进行数值、字符、文件三方面的测试
a=100
b=200
if test a == b
then
echo "相等"
else
echo "不等"
fi
复制代码
if
a=100
b=200
if test $a -eq $b
then
echo "相等"
else
echo "不等"
fi
复制代码
a=100
b=200
if test $a -eq $b
then
echo "相等"
elif test $a -gt $b
then
echo "a大于b"
elif test $a -lt $b
then
echo "a小于b"
fi
复制代码
for
for num in 1 2 3 4
do
echo ${num}
done
复制代码
num=10
for((i=1;i<10;i++));
do
((num=num+10))
done
echo $num
复制代码
while
num=1
while [ $num -lt 100 ]
do
((num++))
done
echo $num
复制代码
无限循环
while:
do
command
done
复制代码
while true
do
command
done
复制代码
for (( ; ; ))
复制代码
until
until condition
do
command
done
复制代码
case
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
复制代码
需要注意的是与其他语言不同Shell使用;;表示break,另外没有一个匹配则使用*捕获该值
echo "输入1 2 3任意一个数字"
read num
case $num in
1)echo "输入了1"
;;
2)echo "输入了2"
;;
3)echo "输入了3"
;;
*)echo "输入的值不是1 2 3"
;;
esac
复制代码
与其他语言类似,循环可以使用break和continue跳出
函数定义 用户自定义函数可以使用或者不使用function关键字,同时指定了return值则返回这个值,如果没有return语句则以最后一条运行结果作为返回值。
function first(){
echo "hello world"
}
复制代码
first(){
echo "hello world"
}
复制代码
调用函数直接使用这个函数名即可
first
复制代码
函数参数 调用函数可以传入参数,函数内部使用{12}、${20}
function add(){
num=0;
for((i=1;i<=$#;i++));
do
num=`expr $i + $num`
done
return $num
}
add 1 2 3 4 5
a=$?
echo $a
复制代码
函数本身是一个命令,所以只能通过$?来获得这个返回值
在上文的例子中可以使用 > 可以将echo结果写入指定文件,这就是一种输出重定向,重定向主要有以下:
将whoami命令输出保存到user文件中
who > "./user"
复制代码
使用cat命令就可以看到内容已经保存了,如果不想覆盖文件的内容那么就使用追加的方式即可。
who >> "./user"
复制代码
Shell脚本可以包含外部脚本,可以很方便的封装一些公用的代码作为一个独立的文件,包含的语法格式如下:
. filename
# 或
source filename
复制代码
如: test1.sh
echo "hello world"
复制代码
test.sh
source ./test1.sh
echo "hello"