test_0
#! /bin/bash
echo 'hello world'
#这是单行注释
:<<EOF
这是一个
多行注释
EOF可以用任意字符串替换
EOF
#定义变量
var1=cute
var2='vv123 is $var1' #注:单引号中的内容不会转译,相当于双引号前加-r
var3="vv123 is $var1"
#声明只读变量
readonly var2
declare -r var3
#声明全局变量
export var2
declare -x var3 #+x:全局变成自定义
#使用变量
echo ${var1}
#删除变量
unset var1
#获取字符串长度
echo ${#var3} #输出13
#取子串
echo ${var3:0:5} #输出vv123
#向脚本传递参数
echo "file name: "$0
echo "pid: "$$
echo "first parameter: "$1
echo "parameter number: "$#
echo "they are: "$* #与&@类似
echo "last command's exit code: "$?
test_1
#! /bin/bash
#定义数组
array=(1 wxh "qwq" vv123) #以空格隔开
f[0]=0
f[2]=2
f[100]=233
echo ${f[0]}
echo ${f[*]} #输出0 2 233
echo ${#f[*]} #输出3
#expr的使用方法
#注1:$(command):返回command这条命令的stdout(可嵌套)
#注2:expr的exit code:
#如果不是逻辑表达式,exit code为0.
#如果是逻辑关系表达式,则结果为真,exit code为0,否则为1。
#字符串表达式
##length STRING
str="hello world"
echo $(expr length "$str") #输出11
##index STRING CHARSET:返回CHARSET中任意字符在STRING中最先出现的位置,下标从1开始,不存在返回0
echo $(expr index "$str" awd) #输出7
##substr STRING POSITION LENGTH
echo $(expr substr "$str" 2 3) #输出ell
#整数表达式
a=3
b=4
echo `expr $a + $b` # 输出7
echo `expr $a - $b` # 输出-1
echo `expr $a \* $b` # 输出12,*需要转义
echo `expr $a / $b` # 输出0,整除
echo `expr $a % $b` # 输出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)` # 输出20,小括号需要转义,各符号之间应有空格
#逻辑表达式
#& | < <= = == != >= >
#=和==是一样的。如果不能把两边转换成整数,按字符串比较
#反斜杠转义==把符号用单引号括起来
a=3
b=4
echo `expr $a \> $b` # 输出0
echo `expr $a '<' $b` # 输出1
echo `expr $a '>=' $b` # 输出0
echo `expr $a \<\= $b` # 输出1
c=0
d=5
echo `expr $c \& $d` # 输出0
echo `expr $a \& $b` # 输出3
echo `expr $c \| $d` # 输出5
echo `expr $a \| $b` # 输出3
a='expr $a + 5' #相当于c语言中的a+=5
#字符串表达式的优先级高于数值表达式和逻辑关系表达式
test_2
#! /bin/bash
##read命令
read -p "What's your name? " -t 5 name
##echo命令
echo -e "hello, ${name}. \c"
#用单引号会原样输出
#-e开启\n \c(\c取消换行)
#输出重定向
echo "hello world" > output.txt
#`(command)` 或 $(command)
echo "Time is `date`"
##printf命令
printf "%10dqwq\n" 123 # 占10位,右对齐
printf "%-10.2fqwq\n" 123.123321 # 占10位,四舍五入保留2位小数,左对齐
printf "My name is %s\n" "wxh" # 格式化输出字符串
printf "%d * %d = %d\n" 2 3 `expr 2 \* 3` # 表达式的值作为参数
test_3
#! /bin/bash
##test 命令
#逻辑运算符&&和||
#借助短路原则,可以用来写if else
test -e test.sh && echo "exist" || echo "not exist"
#test和expr都会用exit code 0表示真,而expr还用stdout 1表示真
test 2 -lt 3
echo $? #输出0
:<<EOF
好家伙 我实在懒得打了 复制粘贴吧
1.文件类型判断
命令格式:test -e filename # 判断文件是否存在
测试参数 代表意义
-e 文件是否存在
-f 是否为文件
-d 是否为目录
2.文件权限判断
命令格式:test -r filename # 判断文件是否可读
测试参数 代表意义
-r 文件是否可读
-w 文件是否可写
-x 文件是否可执行
-s 是否为非空文件
3.整数间的比较
命令格式:test $a -eq $b # a是否等于b
测试参数 代表意义
-eq a是否等于b
-ne a是否不等于b
-gt a是否大于b
-lt a是否小于b
-ge a是否大于等于b
-le a是否小于等于b
4.字符串比较
测试参数 代表义
test -z STRING 判断STRING是否为空,如果为空,则返回true
test -n STRING 判断STRING是否非空,如果非空,则返回true(-n可以省略)
test str1 == str2 判断str1是否等于str2
test str1 != str2 判断str1是否不等于str2
5.多重条件判定
命令格式:test -r filename -a -x filename
测试参数 代表意义
-a 两条件是否同时成立 (也就是python里的and)
-o 两条件是否至少一个成立 (也就是python里的or)
! 取反。如 test ! -x file,当file不可执行时,返回true
6.判断符号[]
[]与test用法几乎一模一样,更常用于if语句中。
另外[[]]是[]的加强版,支持的特性更多。
例如:
[ 2 -lt 3 ] # 为真,返回值为0
echo $? # 输出上个命令的返回值,输出0
ls # 列出当前目录下的所有文件
输出:homework output.txt test.sh tmp
[ -e test.sh ] && echo "exist" || echo "Not exist"
输出:exist # test.sh 文件存
[ -e test2.sh ] && echo "exist" || echo "Not exist"
输出:Not exist # testh2.sh 文件不存在
注意:
[]内的每一项都要用空格隔开
中括号内的变量,最好用双引号括起来
中括号内的常数,最好用单或双引号括起来
例如:
name="acwing yxc"
[ $name == "acwing yxc" ] # 错误,等价于 [ acwing yxc == "acwing yxc" ],参数太多
[ "$name" == "acwing yxc" ] # 正确
作者:yxc
链接:https://www.acwing.com/blog/content/9704/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
EOF
test_4
#! /bin/bash
#单个条件
a=3
b=4
if [ $a -lt $b ] && [ $a -gt 2 ]
then
echo ${a}在范围内
fi
if expr 3 \= 2
then
echo "3等于2"
else
echo "3不等于2"
fi
#多重条件
a=4
if [ $a -eq 1 ]
then
echo ${a}等于1
elif [ $a -eq 2 ]
then
echo ${a}等于2
elif [ $a -eq 3 ]
then
echo ${a}等于3
else
echo 其他
fi
#switch case
a=4
case $a in
1)
echo ${a}等于1
;;
2)
echo ${a}等于2
;;
3)
echo ${a}等于3
;;
*)
echo 其他
;;
esac
test_5
#遍历stdout
for i in `ls`
do
echo $i
done
#seq函数
for i in `seq 1 10`
do
echo $i
done
#{a..b}
for i in {a..z}
do
echo $i
done
#c style
for ((i = 1; i <= 10; i++))
do
echo $i
done
#while (EOF:ctrl+d或c(杀进程))
while read -p "input sth." name
do
echo $name
if [ "$name" == "exit" ]
then
break
fi
done
#until...do...done
until [ "$word" == "stop" ] || [ "$word" == "STOP" ]
do
read -p "please input stop/STOP to kill this program:
" word
done
#break对case不起作用
while read name
do
for i in {1..10}
do
case $i in
5)
continue;
;;
8)
break;
;;
*)
echo $i
;;
esac
done
done
test_6
#! /bin/bash
welcome() {
read -p "tell me your name
" name
echo "hello $name"
}
output=`welcome`
echo "exit code is $?"
echo "stdout is $output"
##参数输入
func() {
if [ $1 -le 0 ]
then
echo 0
return 42
fi
sum=$(func $(expr $1 - 1))
echo $(expr $sum + $1)
}
echo $(func 100)
test_7
#! /bin/bash
if [ $# -ne 1 ]
then
echo "arguments not valid"
exit 1
else
echo "arguments valid"
exit 0
fi
test_8
#! /bin/bash
echo -e "Hello \c" > output.txt
echo "World" >> output.txt
read str < output.txt
echo $str
test_9
#! /bin/bash
read a
read b
echo $(expr $a + $b)
#./test9.sh < input.txt > output.txt
test_10
#! /bin/bash
# name=vv123 in head.sh
source head.sh
echo $name