Linux入门之Shell编程

变量

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 ... fiif 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是否是目录

以下是一些常用的文件测试运算符

  • -e file:判断文件是否存在
  • -f file:判断文件是否为普通文件
  • -d file:判断文件是否为目录
  • -r file:判断文件是否可读
  • -w file:判断文件是否可写
  • -x file:判断文件是否可执行
  • -s file:判断文件大小是否大于 0
  • -h file:判断文件是否为符号链接

  程序举例:多选择语句,类比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

程序举例:读取命令行参数($*代表命令行所有参数)。

#假设脚本名为hello.sh(注意输入在只有一行)
# 输入:. hello.sh 2 2 3 6 3
# 输出:16
sum=0
for i in $*
do
 let sum=sum+i
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 $? #函数返回值在调用该函数后通过 $? 来获得

猜你喜欢

转载自blog.csdn.net/weixin_61725823/article/details/130962598