超详细Shell学习教程第四篇shell脚本参数化

目录

1.1参数化实例

 1.2参数处理说明

1.3带返回值的参数


书写带参数的shell脚本:

1.1参数化实例

创建bash1.sh

#!/bin/bash

echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

运行脚本:

root@ubuntu:/home/lulu/Desktop/Test# ./bash1.sh 
Shell 传递参数实例!
第一个参数为:
参数个数为:0
传递的参数作为一个字符串显示:

root@ubuntu:/home/lulu/Desktop/Test# ./bash1.sh 1,2,3,4
Shell 传递参数实例!
第一个参数为:1,2,3,4
参数个数为:1
传递的参数作为一个字符串显示:1,2,3,4

root@ubuntu:/home/lulu/Desktop/Test# ./bash1.sh 1 2 3 4
Shell 传递参数实例!
第一个参数为:1
参数个数为:4
传递的参数作为一个字符串显示:1 2 3 4

$* 与 $@ 区别:

相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

创建脚本bash.sh:
for i in "$*"; do
            echo $i
    done;
root@ubuntu:/home/lulu/Desktop/Test# chmod +x bash.sh 
root@ubuntu:/home/lulu/Desktop/Test# ./bash.sh  1 2
1 2


创建脚本bash2.sh
for i in "$@"; do
            echo $i
    done;
root@ubuntu:/home/lulu/Desktop/Test# chmod +x bash2.sh 
root@ubuntu:/home/lulu/Desktop/Test# ./bash2.sh  1 2
1
2
echo "执行脚本名称:$0";
echo "获取第一个参数:$1";
echo "获取第二个参数$2";
echo "获取到的参数$*";
echo "获取参数个数$#";
echo "获取的参数每个参数都是一个(str):$@";
echo "读取当前参数(pid):$$";


root@ubuntu:/home/lulu/Desktop/Test# sh test.sh 
执行脚本名称:test.sh
获取第一个参数:
获取第二个参数
获取到的参数
获取参数个数0
获取的参数每个参数都是一个(str):
读取当前参数(pid):20680
root@ubuntu:/home/lulu/Desktop/Test# sh test.sh 1 2 3
执行脚本名称:test.sh
获取第一个参数:1
获取第二个参数2
获取到的参数1 2 3
获取参数个数3
获取的参数每个参数都是一个(str):1 2 3
读取当前参数(pid):20685

 1.2参数处理说明

$#  传递到脚本或函数的参数个数

$*  以一个单字符串显示所有向脚本传递的参数

$$  脚本运行的当前进程ID号

$!  后台运行的最后一个进程的ID号

$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。

$-  显示Shell使用的当前选项,与set命令功能相同。

$?  显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

1.3带返回值的参数

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

脚本执行: 

root@ubuntu:/home/lulu/Documents# ./funWithReturn.sh 
这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
root@ubuntu:/home/lulu/Documents# echo "输入的两个数字之和为 $? !"
输入的两个数字之和为 3 !

关于文件名带空格的处理方法:

#example ./test.sh 2022\ a.text  2022\ b.txt 
##添加这行代码
IFS=$(echo -en "\n\b")

OLD_File=$1
NEW_FIle=${2}

comm -23 grep -E "reg"  ${OLD_File}  ${NEW_FIle} 

 关于文件名带空格的处理方法:

#example ./test.sh 2022\ a.text  2022\ b.txt 
##添加这行代码
IFS=$(echo -en "\n\b")

OLD_File=$1
NEW_FIle=${2}

comm -23 grep -E "reg"  ${OLD_File}  ${NEW_FIle} 

shell判断问题

推荐使用
  if [[ "x$inputValue" == "xy" || "x$inputValue" == "xY" ]]
  then
  fi; 
防止出现异常

read超时

function input_name(){
    echo -e "===================================================================="
    echo -e "enter input_name function"
    echo -e "===================================================================="

    echo -e "do you want input a new names instead of the previous name(please input y/n)"; read -t inputValue
    if [[ "x$inputValue" == "xy" || "x$inputValue" == "xY" ]]
    then
        echo -e "the previous names is: ${name}, do you want input another name(please input y/n)?";  read  inputValue
        if [[ "x$inputValue" == "xy" || "x$inputValue" == "xY" ]]
        then
           echo -e "the previous name is: ${name}, please choose one of the following name input"
           nameList=$(cat names.txt | grep name |awk {'print $1'} | sort -u | paste -sd " ")
           nameArr=(`echo ${nameList} |awk '{len=split($0,a," ");for(i=1;i<=len;i++) print a[i]}'`)
           echo -e "${nameList}"
           echo -e "please input  name:(if you not input name during 30 seconds, we will use default name:${name} )"; read -t $timeout newName
        fi;

    fi;

    echo -e ""

    if [[ -n $newName ]]
    then
        ## 数组包含
        if [[ "${nameArr[@]}" =~ "$newName" ]]
        then
            name=$newName
        else
            echo -e "the name (${name}) you input is not in nameList(${nameList})"
            exit 0;
        fi;

    fi;
    echo -e "do you want input new namespace during executing menu x (please input  y/n)"; read -t inputValue

    echo -e "current name is: ${name}"
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第1章 BashShell命令 6 1.1 Shell提示符 6 1.2 文件与目录Shell命令 7 1.2.1 更改目录命令(cd) 7 1.2.2 列表命令(ls) 7 1.2.3 操作文件命令 10 1.2.4 目录处理命令 14 1.2.5 查看文件内容命令 15 1.3 监控程序 20 1.3.1 进程查看 20 1.3.2 实时进程监控 22 1.3.3 停止进程 24 1.4 监控磁盘空间 25 1.4.1 挂载介质 25 1.4.2 使用df命令 26 1.4.3使用du命令 27 1.5 操作数据文件 28 1.5.1 数据排序(sort) 28 1.5.2 搜索数据 (grep) 30 1.5.3 压缩数据 30 1.5.4 归档数据(tar) 33 1.6 使用Linux环境变量 34 1.6.1 设置环境变量 34 1.6.2 默认的shell环境变量与path变量的设置 37 1.7 Linux文件权限 40 1.7.1 Linux安全性 40 1.7.2 使用Linux用户组 46 1.7.3 解码文件权限 47 1.7.4 修改安全设置 49 1.8 vim编辑器 52 第2章 基本脚本编译 54 2.1 创建脚本与使用变量 54 2.1.1 创建脚本 54 2.1.2 使用变量 55 2.2 重定向输入输出与数学计算 57 2.2.1 输出重定向 57 2.2.2 输入重定向 58 2.2.3 管道 58 2.2.4 数学计算 58 2.3 退出脚本 60 第3章 结构化命令 61 3.1 if语句 61 3.1.1 if-then语句 61 3.1.2 if-then-else语句 61 3.1.3 嵌套if语句 62 3.2 if条件语句 63 3.2.1 数值比较 63 3.2.2字符串比较 64 3.2.3 文件比较 65 3.2.4 复合条件检查 65 3.3 if-then的高级特征与case命令 66 3.3.1 使用双圆括号 66 3.3.2 使用双方括号 67 3.3.3 case命令 67 3.4 for命令 67 3.4.1 读取列表 68 3.4.2 读取变量与读取命令 69 3.4.3 改变字段分隔符与使用通配符读取目录 69 3.4.5 C式的for命令 70 3.5 while、until命令 71 3.5.1 使用多条测试命令 71 3.5.2 until命令与循环嵌套 72 3.6 文件数据的循环与控制循环 73 3.6.1 文件数据的循环 73 3.6.2 break命令 73 3.6.3 continue命令 75 第4章 处理用户输入与显示数据 76 4.1 命令行参数与特殊的参数变量 76 4.1.1 读取参数 76 4.1.2 读取程序名称 77 4.1.3 测试参数 77 4.1.4 参数计数 77 4.1.5 获取所有数据 78 4.2 移位与选项 79 4.2.1 移位 79 4.2.2 找出选项 79 4.2.3 使用getopt命令 81 4.2.4 更高级的getopts命令 83 4.2.4 标准化选项 84 4.3 获取用户输入 84 4.3.1 基本读取 84 4.3.2 计时 85 4.3.3 默读与文件读取 85 4.4 显示数据 86 4.4.1 标准文件描述符 86 4.4.2 重定向错误 87 4.4.3 临时重定向 88 4.4.4永久重定向 88 4.4.5 在脚本中重定向输入 89 4.5 创建自己的重定向 90 4.5.1 创建输出文件描述符 90 4.5.2 重定向文件描述符 90 4.5.3 创建输入文件描述符 91 4.5.4 创建读取/写入文件描述符 91 4.5.5 关闭文件描述符 92 4.5.6列出开发文件描述符 92 4.5.7禁止命令输出 94 4.6 使用临时文件 94 4.6.1 创建本地临时文件 94 4.6.2 在/temp中创建临时文件 95 4.6.3 创建临时目录 96 4.6.4 记录消息 96 第5章 脚本控制 97 5.1 处理信号 97 5.1.1 Linux信号回顾 97 5.1.2 生成信号 97 5.1.3捕获信号 99 5.1.4捕获脚本退出 99 5.1.4移除捕获 100 5.2 以后台模式运行脚本 100 5.3 作业控制 102 5.3.1查看作业 102 5.3.2重新启动停止的作业 103 5.4 nice与renice命令 104 5.4.1 nice命令 104 5.4.2 renice命令 104 5.5 定时运行脚本 105 5.5.1使用at命令调度作业 105 5.5.2使用batch命令调 107 5.5.3 调用定期脚本 107 5.6 从头开始 109 5.6.1在启动时启动脚本 109 5.6.2随新shell一起启动 109 第6章 创建函数 110 6.1 基本脚本函数 110 6.1.1 创建函数 110 6.1.2 使用函数 110 6.2 返回值 111 6.2.1 默认退出状态 111 6.2.2 使用return命令 111 6.2.3 使用函数输出 112 6.3 在函数中使用变量 112 6.3.1 向函数传递参数 112 6.3.2 在函数中处理变量 113 6.4 数组变量与函数 114 6.4.1 向函数传递数组 114 6.4.2从函数返回数组 115 6.5 函数递归与创建库 116 6.5.1函数递归 116 6.5.2 创建库 116 6.6 在命令行中使用函数 117 6.6.1在命令行创建函数 117 6.6.2在.bashrc文件中定义函数 117 6.7 select命令使用 119 第7章 sed、gawk介绍与正则表达式 120 7.1 sed编辑器 120 7.1.1 在命令行中定义编辑器命令 120 7.1.2 在命令行中使用多个编辑器命令 121 7.1.3 从文件读取编辑器命令 121 7.2 gawk程序 122 7.2.1 gawk命令格式 122 7.2.2 自命令行读取程序脚本 122 7.2.3 使用数据字段变量 123 7.2.4 在程序脚本中使用多个命令 124 7.2.5从文件读取程序 124 7.2.6 在处理数据之前运行脚本 125 7.2.7 在处理数据之后运行脚本 125 7.3 sed编辑器基础知识 126 7.3.1 更多替换选项 126 7.3.2 使用地址 127 7.3.3 删除行 128 7.3.4 插入和附加文本 129

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值