参数传递

  1. #!/bin/bash
  2. # 参数传递
  3. # 如果是终端执行如下: ./test.sh 1 2 3
  4. # 执行的文件名:./test.sh
  5. # 第一个参数为:1
  6. # 第二个参数为:2
  7. # 第三个参数为:3
  8. echo "Shell 传递参数实例!";
  9. echo "执行的文件名:$0";
  10. echo "第一个参数为:$1";
  11. echo "第二个参数为:$2";
  12. echo "第三个参数为:$3";
  13. echo "脚本当前执行的进程ID号: $$";
  14. echo "后台运行的最后一个进程ID号: $!";
  15. echo "以单个字符显示所有向脚本传递的参数: $@";
  16. echo "显示最后命令的退出状态,0表示没有错误: $?";
  17. # 终端执行 /bin/bash shell.sh 1 2 3
  18. :<<!
  19. 第一个参数为:1
  20. 第二个参数为:2
  21. 第三个参数为:3
  22. 脚本当前执行的进程ID号: 13591
  23. 后台运行的最后一个进程ID号:
  24. 以单个字符显示所有向脚本传递的参数: 1 2 3
  25. 显示最后命令的退出状态,0表示没有错误: 0
  26. !

参数传递-getopt

  1. # 使用 `"$@"' 来让每个命令行参数扩展为一个单独的单词。 `$@' 周围的引号是必不可少的!
  2. # 使用 getopt 整理参数
  3. ARGS=$(getopt -o 'u:r:m:s:c:n:l:' -l 'user_id:,recall_type:,model_key:,scene:,content_type_limit:,request_num:,slave:' -- "$@")
  4. echo "===============================ARGS=================================="
  5. echo "$ARGS"
  6. echo "===============================ARGS=================================="
  7. if [ $? != 0 ] ; then echo "Parse error! Terminating..." >&2 ; exit 1 ; fi
  8. # 将参数设置为 getopt 整理后的参数
  9. # $ARGS 需要用引号包围
  10. eval set -- "$ARGS"
  11. # 循环解析参数
  12. while true ; do
  13. # 从第一个参数开始解析
  14. case "$1" in
  15. # 用户,需要带参数值,所以通过 $2 取得参数值,获取后通过 shift 清理已获取的参数
  16. # shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理
  17. -u|--user_id) USER_ID="$2" ; shift 2 ;;
  18. -r|--recall_type) RECALL_TYPE="$2" ; shift 2 ;;
  19. -m|--model_key) MODEL_KEY="$2" ; shift 2 ;;
  20. -s|--scene) SCENE="$2" ; shift 2 ;;
  21. -c|--content_type_limit) CONTENT_TYPE_LIMIT="$2" ; shift 2 ;;
  22. -n|--request_num) REQUEST_NUM="$2" ; shift 2 ;;
  23. -l|--slave) SLAVE="$2" ; shift 2 ;;
  24. --) shift ; break ;;
  25. *) echo "Internal error!" ; exit 1 ;;
  26. esac
  27. done
  28. echo "======================================================================"
  29. # 显示获取参数结果
  30. echo '用户: ' "$USER_ID"
  31. echo '召回类型: ' "$RECALL_TYPE"
  32. echo '召回队列: ' "$MODEL_KEY"
  33. echo '请求数量: ' "$REQUEST_NUM"
  34. echo '召回场景: ' "$SCENE"
  35. echo '召回内容限定: ' "$CONTENT_TYPE_LIMIT"
  36. echo '启动slave: ' "$SLAVE"
  37. echo "======================================================================"
  38. echo "================================杀进程================================="
  39. echo 'ps -ef | grep locust | grep -v grep | grep -E "8879|recall_perf.py" | awk '{print $2}' | xargs kill -9'
  40. echo "================================杀进程================================="
  41. ps -ef | grep locust | grep -v grep | grep -E "8879|recall_perf.py" | awk '{print $2}' | xargs kill -9
  42. # 启动master
  43. echo "启动master"
  44. cd /home/work/knowledge_recommendation_perf/locust_file
  45. nohup 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" &
  46. # 启动slave
  47. echo "启动slave"
  48. cd /home/work/knowledge_recommendation_perf/locust_file
  49. i=1
  50. while [ $i -le "$SLAVE" ]
  51. do
  52. let i++
  53. 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" &
  54. done
  55. :<<!
  56. 启动命令示例
  57. 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
  58. !

参数传递-getopts

  1. #!/bin/bash
  2. # 处理脚本参数
  3. # -u 用户名
  4. # -p 密码
  5. # -v 是否显示详情
  6. # -n 端口
  7. while getopts ":u:p:n:v" opt_name # 通过循环,使用 getopts,按照指定参数列表进行解析,参数名存入 opt_name
  8. do
  9. case "$opt_name" in # 根据参数名判断处理分支
  10. 'u') # -u
  11. CONN_USERNAME="$OPTARG" # 从 $OPTARG 中获取参数值
  12. ;;
  13. 'p') # -p
  14. CONN_PASSWORD="$OPTARG"
  15. ;;
  16. 'v') # -v
  17. CONN_SHOW_DETAIL=true
  18. ;;
  19. 'n') # -n
  20. CONN_PORT="$OPTARG"
  21. ;;
  22. ?) # 其它未指定名称参数
  23. echo "Unknown argument(s)."
  24. exit 2
  25. ;;
  26. esac
  27. done
  28. # 删除已解析的参数
  29. shift $((OPTIND-1))
  30. # 通过第一个无名称参数获取 主机
  31. CONN_HOST="$1"
  32. # 显示获取参数结果
  33. echo 用户名 "$CONN_USERNAME"
  34. echo 密码 "$CONN_PASSWORD"
  35. echo 主机 "$CONN_HOST"
  36. echo 端口 "$CONN_PORT"
  37. echo 显示详情 "$CONN_SHOW_DETAIL"

特殊参数

  1. :<<!
  2. $#:传递到脚本的参数个数
  3. $*:以单个字符显示所有向脚本传递的参数
  4. $$:脚本当前执行的进程ID
  5. $!:后台运行的最后一个进程ID
  6. $@:同$*
  7. $?:显示最后命令的退出状态,0表示没有错误
  8. !

$@ 与 $* 的区别

  1. echo "---\$* 演示---"
  2. for i in "$*"; do
  3. echo $i
  4. done
  5. echo "----\$@ 演示---"
  6. for i in "$@"; do
  7. echo $i
  8. done
  9. :<<!
  10. ---$* 演示---
  11. 1 2 3
  12. ----$@ 演示---
  13. 1
  14. 2
  15. 3
  16. !

https://www.jianshu.com/p/ad05cffede0b https://blog.csdn.net/wanglz666/article/details/44565809 https://www.cnblogs.com/klb561/p/9211222.html