参数传递
#!/bin/bash# 参数传递# 如果是终端执行如下: ./test.sh 1 2 3# 执行的文件名:./test.sh# 第一个参数为:1# 第二个参数为:2# 第三个参数为:3echo "Shell 传递参数实例!";echo "执行的文件名:$0";echo "第一个参数为:$1";echo "第二个参数为:$2";echo "第三个参数为:$3";echo "脚本当前执行的进程ID号: $$";echo "后台运行的最后一个进程ID号: $!";echo "以单个字符显示所有向脚本传递的参数: $@";echo "显示最后命令的退出状态,0表示没有错误: $?";# 终端执行 /bin/bash shell.sh 1 2 3:<<!第一个参数为:1第二个参数为:2第三个参数为:3脚本当前执行的进程ID号: 13591后台运行的最后一个进程ID号:以单个字符显示所有向脚本传递的参数: 1 2 3显示最后命令的退出状态,0表示没有错误: 0!
参数传递-getopt
# 使用 `"$@"' 来让每个命令行参数扩展为一个单独的单词。 `$@' 周围的引号是必不可少的!# 使用 getopt 整理参数ARGS=$(getopt -o 'u:r:m:s:c:n:l:' -l 'user_id:,recall_type:,model_key:,scene:,content_type_limit:,request_num:,slave:' -- "$@")echo "===============================ARGS=================================="echo "$ARGS"echo "===============================ARGS=================================="if [ $? != 0 ] ; then echo "Parse error! Terminating..." >&2 ; exit 1 ; fi# 将参数设置为 getopt 整理后的参数# $ARGS 需要用引号包围eval set -- "$ARGS"# 循环解析参数while true ; do# 从第一个参数开始解析case "$1" in# 用户,需要带参数值,所以通过 $2 取得参数值,获取后通过 shift 清理已获取的参数# shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理-u|--user_id) USER_ID="$2" ; shift 2 ;;-r|--recall_type) RECALL_TYPE="$2" ; shift 2 ;;-m|--model_key) MODEL_KEY="$2" ; shift 2 ;;-s|--scene) SCENE="$2" ; shift 2 ;;-c|--content_type_limit) CONTENT_TYPE_LIMIT="$2" ; shift 2 ;;-n|--request_num) REQUEST_NUM="$2" ; shift 2 ;;-l|--slave) SLAVE="$2" ; shift 2 ;;--) shift ; break ;;*) echo "Internal error!" ; exit 1 ;;esacdoneecho "======================================================================"# 显示获取参数结果echo '用户: ' "$USER_ID"echo '召回类型: ' "$RECALL_TYPE"echo '召回队列: ' "$MODEL_KEY"echo '请求数量: ' "$REQUEST_NUM"echo '召回场景: ' "$SCENE"echo '召回内容限定: ' "$CONTENT_TYPE_LIMIT"echo '启动slave: ' "$SLAVE"echo "======================================================================"echo "================================杀进程================================="echo 'ps -ef | grep locust | grep -v grep | grep -E "8879|recall_perf.py" | awk '{print $2}' | xargs kill -9'echo "================================杀进程================================="ps -ef | grep locust | grep -v grep | grep -E "8879|recall_perf.py" | awk '{print $2}' | xargs kill -9# 启动masterecho "启动master"cd /home/work/knowledge_recommendation_perf/locust_filenohup locust -f recall_perf.py --web-host=0.0.0.0 --master -P 8879 --user_id "$USER_ID" --recall_type "$RECALL_TYPE" --model_key "$MODEL_KEY" --scene "$SCENE" --content_type_limit "$CONTENT_TYPE_LIMIT" --request_num "$REQUEST_NUM" &# 启动slaveecho "启动slave"cd /home/work/knowledge_recommendation_perf/locust_filei=1while [ $i -le "$SLAVE" ]dolet i++nohup locust -f recall_perf.py --web-host=0.0.0.0 --worker --user_id "$USER_ID" --recall_type "$RECALL_TYPE" --model_key "$MODEL_KEY" --scene "$SCENE" --content_type_limit "$CONTENT_TYPE_LIMIT" --request_num "$REQUEST_NUM" &done:<<!启动命令示例sh /home/work/knowledge_recommendation_perf/run_locust_script/run_recall_locust.sh --user_id tangyuehan --recall_type MeetingRecall --model_key Meeting --scene 63 --content_type_limit 9 --request_num 101 --slave 5!
参数传递-getopts
#!/bin/bash# 处理脚本参数# -u 用户名# -p 密码# -v 是否显示详情# -n 端口while getopts ":u:p:n:v" opt_name # 通过循环,使用 getopts,按照指定参数列表进行解析,参数名存入 opt_namedocase "$opt_name" in # 根据参数名判断处理分支'u') # -uCONN_USERNAME="$OPTARG" # 从 $OPTARG 中获取参数值;;'p') # -pCONN_PASSWORD="$OPTARG";;'v') # -vCONN_SHOW_DETAIL=true;;'n') # -nCONN_PORT="$OPTARG";;?) # 其它未指定名称参数echo "Unknown argument(s)."exit 2;;esacdone# 删除已解析的参数shift $((OPTIND-1))# 通过第一个无名称参数获取 主机CONN_HOST="$1"# 显示获取参数结果echo 用户名 "$CONN_USERNAME"echo 密码 "$CONN_PASSWORD"echo 主机 "$CONN_HOST"echo 端口 "$CONN_PORT"echo 显示详情 "$CONN_SHOW_DETAIL"
特殊参数
:<<!$#:传递到脚本的参数个数$*:以单个字符显示所有向脚本传递的参数$$:脚本当前执行的进程ID号$!:后台运行的最后一个进程ID号$@:同$*$?:显示最后命令的退出状态,0表示没有错误!
$@ 与 $* 的区别
echo "---\$* 演示---"for i in "$*"; doecho $idoneecho "----\$@ 演示---"for i in "$@"; doecho $idone:<<!---$* 演示---1 2 3----$@ 演示---123!
https://www.jianshu.com/p/ad05cffede0b https://blog.csdn.net/wanglz666/article/details/44565809 https://www.cnblogs.com/klb561/p/9211222.html
