nano hello.sh 编辑hello.sh这个shell脚本文件,如写上echo 'hello!!!'。其中,在编辑的最开始加上#!/bin/bash 表示该脚本文件用bash执行,#是注释,#!不是注释。
bash/source/. hello.sh 执行hello.sh,如输出hello!!!
name=zs 定义用户自定义变量name
echo $name 输出用户自定义变量的值为zs
env 查看环境变量
export name 将name用户自定义变量变成环境变量
readonly name 设置name变量为只读
unset name 清除name变量
current_dir=$(pwd) 将pwd执行的结果赋值给current_dir,也可以current_dir=`pwd`(反引号)。
read name 从键盘输入name(read -p "Please input your name:" name就提示键盘输入name)。
read name1 name2 other 输入多个变量,other用于存多输入的变量
echo -e "zs\nzss" 加上-e才能处理转义字符
echo -n "zs" 加上-n则取消默认的末尾换行
expr $a + $b 计算a+b,因linux默认都是字符串故不能直接计算(注意如大于要\>,乘要\*转义)。
c=`expr $a + $b` 通过命令替换将计算结果赋值给c
c=$((a + b)) 或let c=a+b 计算a+b赋值给c(这里运算符+前后可加或不加空格)
c=$(echo "$a+$b" | bc) 用管道给bc计算浮点数a+b,也可以单独写bc然后边读边计算浮点数。
c=`echo "$a+$b" | bc` 用反引号命令替换也可以计算浮点数a+b然后赋值给c
与:-a / &&,或:-o / ||
shift 1 将变量左移1个,比如$2变成$1,$3变成$2以此类推($1等是位置参数,$?存返回值)。
set -- -rw-r--r-- 1 root root 10272 May 25 10:34 /etc/passwd 执行后$1即-rw-r--r--,$2即1,$3即root以此类推(加--是因-rw-r--r--最前面的-会被识别为option故要前再加--让识别为字符串)。
if [ $a -ge $b ] then ... fi或if test $a -ge $b then ... fi 中括号那要有空格,即c中的if(a>=b){...}。
if [ $a -ge $b ] then ...elif [ 条件 ];then...else... fi then即c中的{,fi即},then不换行时前要加;。
if ((x%2==0)) 判断x是否是偶数((( expression )) 用于进行数值比较和运算)。
if [ -d "$file_name" ] 判断给定的文件file_name是否是目录。
以下是一些常用的文件测试运算符:
程序举例:多选择语句,类比switch ... case。
#!/bin/sh
site="runoob"
case "$site" in
"runoob") echo "菜鸟教程"
;;
"google") echo "Google 搜索"
;;
"taobao") echo "淘宝网"
;;
*) echo "以上都不是"
;;
esac
for i in zs lisi do...done 两次循环,第一次i即zs,第二次i即lisi,do前有换行,类比python的for。
for i in `seq 1 2 10` do...done 从1到10步长为2的循环,删2则步长为1,类比range但此闭区间。
for i in {1..10}; do...done 用{1..10}生成从1-10的整数序列,即i为1-10。
程序举例:for循环同样也可(( expression )),下面是1+22+333+4444+…的前n项和。
#!/bin/bash
read n
sum=0
for ((i=1; i<=n; i++));do
value=i
for ((j=2;j<=i;j++));do
value=$((value*10+i))
done
sum=$((sum+value))
done
echo $sum
程序举例:while循环举例。
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
程序举例:永真循环举例。
#写法一
while :
do
command
done
#写法二
while true
do
command
done
#写法三
for (( ; ; ))
补充:
until 循环执行一系列命令直至条件为 true 时停止(与 while 循环在处理方式上刚好相反)。
循环中同样有和C++一样的break和continue。
程序举例:数组的定义、输入与访问遍历。
# 定义数组
arr=(value1 value2 value3)
# 从标准输入读取多个值,并存储到数组中
read -a arr
# 访问数组元素
echo "${arr[0]}" # 输出 value1
echo "${arr[1]}" # 输出 value2
echo "${arr[2]}" # 输出 value3
# 遍历数组,用${arr[@]}获取数组长度
for i in "${arr[@]}"; do
echo "$i"
done
# 将一组数据直接读入然后遍历字符串每个空格隔开的值也像遍历数组一样
read str
for i in $str
do
echo $i
done
程序举例:函数的传参与返回值。
#!/bin/bash
fun(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !" #当n>=10时,需要使用${n}来获取参数
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
return 123
}
fun 1 2 3 4 5 6 7 8 9 34 73
echo $? #函数返回值在调用该函数后通过 $? 来获得