鸟书shell学习(三)shell脚本程序设计要点总结

一 注意事项

1.脚本的开头一行为 :

#!/bin/bash

声明这个脚本需要的shell的名称

2.程序中出了"#!"之外的其他以#开头的都是注释内容

3.为了方面的使用系统命令,可以在程序的开始部分设置主要环境变量例如PATH

4.脚本程序的运行方法:

  • sh example.sh 或者类似 bash example.sh
  • chmod +x example.sh ; ./example.sh    ################################ 这两种执行方式都是在新建的子进程中完成的
  • source example.sh 或者 . example.sh 则是在父进程中直接执行命令的

二 简单脚本

2.1 交互式脚本,处理简单的输入输出

首先是读取用户输入的read命令,输出的命令就是echo ,例如:

read -p ‘please input your first name: ‘ firstname

echo ‘your first name is : $firstname‘

shell中变量是没有申明比较随意不需要指定类型,在引用的时候, $变量名 或者是 ${变量名}

除了这种方式之外就是通过执行脚本时的参数的传递,在shell中参数名是内置的$0,$1,$2,$4...

这里$0表示文件名,$1开始表示第一个参数,其他依次类推. 初次之外还有其他特殊的参数名,如下:

  • $# : 表示参数个数
  • [email protected]:代表"$1","$2" ... 之意
  • $*:代表"$1 $2 $3 ..." 之意

    eg:

#!/bin/bash
echo 'filename:'$0
echo 'args size: '$#
echo 'first arg:'$1

2.2 数值运算

shell只能够支持整数的基本运算:+ - * / %

1).declare - i var 可以将变量声明为整数,然后对变量进行运算,变量运算是这样的:$((计算式)) eg:

declare -i v1
declare -i v2
v3=$(($v1 + $v2))
#也可以这样计算:
declare -i v3=$v1*$v2 #表达式之间不能有空格

2).var=$((运算内容)) //运算内容中间是允许有空格的 eg:

echo $ (( 19 + 78))

2.3 shell中的判断式

shell中可以用test命令进行判断,eg:

test -e ./example.sh #测试文件是否存在

常见测试类型和参数如下:截图来自鸟哥的Linux私房菜

除了可以用test命令进行条件判断之外i,还可以用[] (中括号的语法进行判断,判断测试参数和test一样).

[]语法要求[]内的所有量之间均有空格,eg:

[b"$name"b==b"xiaoyi"b] #b都表示空格

三 复杂脚本

3.1 条件语句

if else 的标准格式:

if [ 条件判断1 ] ; then
   command1
elif [ 条件判断2 ] ; then
   command2
else
   command3
fi

其中,条件可以用&&或者||进行连接

case...esac的标准格式如下:

case $variableName in
"第一个变量内容")
    程序段
    ;;   #每个类型的结尾类似break
"第二个变量内容")
    程序段
    ;;
*)# 类似default 用* 代替
    其他不符合条件的程序段
    ;;
esac 

3.2 循环语句

循环的几种格式如下:

  • while do done

    while [ condition ]
    do
       程序段
    done
  • until do done
    until [ condition ]
    do
      程序段
    done
  • for...do...done

    for var in cond1 cond2 cond3 ...
    do
      程序段
    done
    
    for ((初始值;限制值;执行步长))
    do
      程序段
    done

3.3 函数

function fname(){
    程序段
}

examples:

#!/bin/bash
# if --- else -- exmaple
declare -i v1=10
declare -i v2=15

if [ $v1 -ge $v2 ] ; then
echo ''$v1' is bigger than '$v2''
else
echo ''$v1' is smaller than '$v2''
fi

# case ... esac example
read -p 'Please input your name : ' name
case $name in
"xiaoyi")
	echo 'hello xiaoyi'
	;;
"xiaoyi1")
	echo 'hello xiaoyi1'
	;;
*)
	echo 'no case matched!'
	;;
esac

# loop example
declare lv=1
while [ $lv -le 10 ]
do
	echo $lv
	lv=$((${lv}+1))
done

until [ $lv -le 1 ]
do
	echo $lv
	lv=$((${lv}-1))
done

for c in 'c1' 'c2' 'c3'
do
	echo $c
done

for ((i=0;i<10;i=i+1))
do
	echo $i
done

 function printHello(){
	echo 'hello'
}

printHello 
时间: 2024-08-25 07:24:05

鸟书shell学习(三)shell脚本程序设计要点总结的相关文章

Shell学习之Shell特性(一)

Shell学习之Shell特性 目录 命令和文件自动补齐功能 命令历史记忆功能 history.上下键.!number.!string.!$.!! 别名功能 alias.unalias cp.~username/.bashrc.\cp -rf /etc/hosts 快捷键 ^R ^D ^A ^E ^L ^U ^K ^S ^Q 前后台作业控制 输入输出重定向 输入与输出 管道 | tee 命令排序 命令和文件自动补齐功能 这个不说了,我们在输入命令的时候,按tab键补全. 命令历史记忆功能  hi

shell学习三十五天----波浪号展开与通配符

波浪号展开与通配符 shell中两种与文件名相关的展开.第一种是波浪号展开,第二种是通配符展开式. 波浪号展开 如果命令行字符串的第一个字符为波浪号(~),或者变量指定(例如PATH或CDPATH变量)的值里任何未被引号括起来的冒号之后的第一个字符为波浪号(~)时,shell变回执行波浪号展开. 波浪号展开的目的,将用户根目录的符号型表示方式,改为实际的目录路径.可以采用直接或间接的方式指定执行此程序的用户,如未明白指定,则为当前的用户: 命令:vi ~/.profile       与vi $

shell学习三十一天----函数问题

函数 案例一: #!/bin/bash hello () { echo "hahahah" } hello 执行函数,结果为:hahaha 案例二: #!/bin/bash funWithReturn() { echo "the function is to get the sum of two number" read -p "input first number" num1 read -p "input second number&

linux shell学习三

Shell for循环 Shell for循环的语法如下所示 for 变量 in 列表 do command1 command2 ... commandN done 举例: for i in {1..100} do echo $i done 类C语言也是可以的 for ((i=1; i<=100; i ++)) do echo $i done Shell while循环 while command do Statement(s) to be executed if command is true

shell学习三十三天----关于重定向

关于重定向 额外的重定向运算符 使用set -C搭配 POSIX shell提供了防止文件意外截断的选项:运行set -C命令可打开shell所谓的禁止覆盖选项,当它再打开状态时,单纯的>重定向遇到目标文件已存在时,就会失败.>|运算符则能够另noclobber选项失效. 提供行内输入的<<和<<-:使用program<<得力miter,能够在shell脚本正文内提供输入数据;这样数据叫嵌入文件.在默认情况下,shell能够在嵌入文件正文内做变量.命令和算数

shell学习三十八天----执行顺序和eval

执行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包含了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 事实上嗨哟很多特殊符号可用来分割单个的命令:分号(;),管道(|),&,逻辑AND(&&),逻辑OR(||).对于每一个地区的管道,shell都会将命令分割,为管道设置I/O,并且对每一个命令依次执行下面的操作. 看起来很复杂,但是每一个步骤都是在shell的内存里发生的,shell不会真的把每个步骤的发生演示给我们看.所以这是我们分析shell内

Shell学习笔记 - Shell变量

一.变量的命名 变量名必须以字母或下划线开头,由字母.数字.或下划线组成,变量名的长度不能超过255个字符. 二.变量的分类 1. 用户自定义变量 2. 环境变量 3. 位置参数变量 4. 预定义变量 三.用户自定义变量 用户自定义变量是“局部变量”,只能在当前的Shell中生效 1. 定义变量 变量名=变量值 示例: 注意:等号前后不能有空格,否则会出现以下错误提示: 2. 变量调用 $变量名 或 ${变量名} 示例: 3. 变量叠加 示例: 或: 4. 删除变量 unset 变量名 示例:

shell学习三十四天----printf详解

printf 先来看一个简单的例子:使用命令printf "hello,world\n", 输出:hello,world 再使用echo "hello,world\n",输出为:hello,world\n 案例二:使用命令printf "%s\n" hello,world 输出结果为:hello,world printf命令的完整语法有两个部分: printg format-string [arguments] 第一部分为描述格式规格的字符串,他

shell学习三十七天----引用

引用 案例,如果我想输出一个星号(*),使用echo如何做? echo * 这是肯定不行的,需要将*转移,即:echo \* 这样就引出了引用的概念.所为引用,是用来防止shell将某些你想要的东西解释成不同的意义.如果你希望某些可能被shell视为个别参数的东西保持为单个参数,这时你就必须将其引用. 引用的三种方式: 反斜杠转义 字符前置反斜杠(\),用来告知shell该字符即为其字面上的意义. 单引号 单引号('...')强制shell将一对引号之间的所有字符都看做其字面上的意义.shell