Linux下运行sh文件出现 invalid option set: -问题的解决

Linux下运行sh文件出现 invalid option set: -问题的原因主要是因为你可能在Windows环境下打开过.sh文件,那么无形中就会改变文件的一些属性,比如换行符的问题。这种情况极大的概率出现在在Windows环境下,打开,修改并保存了.sh文件。

解决方案是:在Linux环境下,在你的目标文件夹下,键入命令行

yum install dos2unix -y

在你的目标文件夹下,键入命令行

vi ./*.sh

这里的*是你的sh文件名,记得修改。

进入之后,在sh文件首行加入一句话 set ff=UNIX

保存并退出

再在你的目标文件加下,键入命令行

dos2unix -q *.sh

同样这里的*是具体文件名,需要修改。

这样就可以正常运行了。

sh *.sh

 

从你的描述来看,这段脚本涉及处理命令行参数,并且存在“參數順序異常”的问题。我们可以分析如何解决这个问题。 在这段代码中,`getopt` 被用来解析短选项 (`SHORT`) 和长选项 (`LONG`) 参数。如果用户输入的参数顺序不符合预期,则需要调整逻辑以支持更灵活的参数传递方式。 以下是解决方案及解释: --- ### 解决方案 当遇到參數順序異常時,可以通過以下步驟來優化腳本處理邏輯: #### 1. 使用 `getopt` 的標準輸出進行排序 `getopt` 工具會將解析後的有效選項按正確格式排列並返回給 `$VALID_ARGS` 變量。因此,即使用戶輸入的參數順序錯亂,只要符合語法規則,`getopt` 都能自動調整為合適的順序。 例如,在你的代碼中: ```bash VALID_ARGS=$(getopt -a --options "$SHORT" --longoptions "$LONG" -- "$@") ``` 這一行已經完成了對參數的驗證與整理工作。接下來只需要按照固定的循環結構逐一讀取即可。 --- #### 2. 循環處理參數 使用 `eval set -- "${VALID_ARGS}"` 將整理好的參數重新設置到位置變量(`$1`, `$2`, ...)中,然後通過一個 `while` 循環逐步解讀每個參數。 示範代碼如下: ```bash # 如果 getopt 返回錯誤,直接退出 if [[ $? -ne 0 ]]; then echo "Invalid option provided. Use --help for usage information." exit 1 fi # 重新分配整理後的位置變量 eval set -- "${VALID_ARGS}" # 初始化變量(根據需求添加) FORCE_CLEAN_BUILD=false CLEAN_BUILD=false PLAT="" LOCAL_IMAGE_ID="" DOCKER_NAME="" STAT_CODE="" # 開始處理參數 while true; do case "$1" in # 短參數部分 y) FORCE_CLEAN_BUILD=true shift ;; c) CLEAN_BUILD=true shift ;; p:) PLAT="$2" if [ -z "$PLAT" ]; then echo "Error: Platform (-p) cannot be empty!" exit 1 fi shift 2 ;; # 同時移除 $1 和 $2 (即當前參數及其值) i:) LOCAL_IMAGE_ID="$2" if [ -z "$LOCAL_IMAGE_ID" ]; then echo "Error: Image ID (-i) cannot be empty!" exit 1 fi shift 2 ;; n:) DOCKER_NAME="$2" if [ -z "$DOCKER_NAME" ]; then echo "Error: Docker name (-n) cannot be empty!" exit 1 fi shift 2 ;; s:) STAT_CODE="$2" if [ -z "$STAT_CODE" ]; then echo "Error: Status code (-s) cannot be empty!" exit 1 fi shift 2 ;; # 長參數部分 --force_clean_build) FORCE_CLEAN_BUILD=true shift ;; --clean_build) CLEAN_BUILD=true shift ;; --plat:) PLAT="$2" if [ -z "$PLAT" ]; then echo "Error: Platform (--plat) cannot be empty!" exit 1 fi shift 2 ;; --local_image_id:) LOCAL_IMAGE_ID="$2" if [ -z "$LOCAL_IMAGE_ID" ]; then echo "Error: Local image ID (--local_image_id) cannot be empty!" exit 1 fi shift 2 ;; --docker_name:) DOCKER_NAME="$2" if [ -z "$DOCKER_NAME" ]; then echo "Error: Docker name (--docker_name) cannot be empty!" exit 1 fi shift 2 ;; --stat_code:) STAT_CODE="$2" if [ -z "$STAT_CODE" ]; then echo "Error: Status code (--stat_code) cannot be empty!" exit 1 fi shift 2 ;; --) shift break ;; # 表明所有帶有 `-` 或者 `--` 的選項已結束 *) echo "Internal error!" >&2 exit 1 ;; esac done # 打印最終結果(測試用) echo "Force Clean Build: ${FORCE_CLEAN_BUILD}" echo "Clean Build: ${CLEAN_BUILD}" echo "Platform: ${PLAT:-None}" echo "Local Image ID: ${LOCAL_IMAGE_ID:-None}" echo "Docker Name: ${DOCKER_NAME:-None}" echo "Status Code: ${STAT_CODE:-None}" ``` --- #### 3. 添加幫助信息 為了让用户了解正确的參數順序和格式,可以在腳本中加入 `--help` 功能: ```bash if [ "$1" = "--help" ] || [ $# -eq 0 ]; then cat <<EOF Usage: script.sh [-y] [-c] [-p <platform>] [-i <image-id>] [-n <name>] [-s <status-code>] or with long options: [--force_clean_build] [--clean_build] [--plat <platform>] [--local_image_id <id>] [--docker_name <name>] [--stat_code <code>] Options: -y/--force_clean_build Force clean build. -c/--clean_build Enable clean build mode. -p/--plat Specify the target platform. -i/--local_image_id Set local image identifier. -n/--docker_name Define docker container name. -s/--stat_code Provide a status code. Example: ./script.sh -p linux-x86_64 -i my-image-123 -n test-container -s OK EOF exit 0 fi ``` --- ### 总结 通过上述步骤,我們解决了参數顺續异常的问题,同时增强了脚本的健壯性和易用性。 §§相關問題§§: 1. 如何檢查命令行參數是否缺失必要值? 2. Bash 中除了 `getopt`,還有其他工具可以用於參數解析嗎? 3. 在 Shell Script 中,什麼時候應該選擇長選項而不是短選項?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值