#!/bin/bash echo "hello, world"
运行程序能够做为解释器参数或者做为可执行程序shell
bash test.sh
chmod +x test.sh test.sh
命名数组
name="huruji"
须要注意的是变量名与等号之间不能有空格。bash
echo $name echo ${name}
使用在变量名前添加$便可,{}表示这个变量名的边界。函数
只读变量工具
name="huruji" readonly name
使用readonly能够将变量定义为只读变量,只读变量不能再次赋值测试
删除变量spa
name="huruji" unset name
使用unset删除变量,以后不能再使用。code
name="huruji" echo "my name is $name"
字符串可使用单引号和双引号,单引号中不能包含单引号,即便转义单引号也不次那个,双引号则能够,双引号也可使用字符串。orm
拼接blog
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
函数参数
调用函数能够传入参数,函数内部使用$n获取传入的参数,相似于运行程序使用时获取使用的参数,不过须要注意的是两位数以上应该使用{}告诉shell边界例如${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"