我正在嘗試通過 golang 程式將引數傳遞給 bash 腳本,但是我在 bash 腳本正確接收引數時遇到了問題。
Golang 函式:
func testLink(link string) {
stdout, err := exec.Command("/bin/sh", "-c", "./test.sh", link).Output()
if err != nil {
log.Fatalf("Error running test script: %s", err)
}
fmt.Println(string(stdout))
}
它呼叫以下 bash 腳本:
#!/bin/sh
LINK=${@:$OPTIND:1}
if [[ -z "$LINK" ]]; then
echo "The link is required"
exit 1
fi
PARSED_LINK=$(echo $LINK | awk '{split($0,a,"/"); print a[5]}')
#do some other actions
我可以毫無問題地運行腳本,并得到預期的輸出。但是,在運行 golang 代碼時:
$ go run main.go test https://github.com/test/test
2021/12/28 20:48:02 Error running test script: exit status 1
exit status 1
如何將引數傳遞go run main.go function argument給 bash 腳本?
另外,我知道它因接收引數而失敗,因為如果我更改 if 段中的退出代碼,則 go 可執行檔案的輸出會更改。
uj5u.com熱心網友回復:
對于要傳遞的引數,您需要洗掉-c否則它們將被視為 sh 可執行檔案而不是您的腳本的引數。
cmd := exec.Command("/bin/sh", "./test.sh", link)
我想另外你的問題是你如何撰寫你的shell腳本。那個變數賦值看起來很奇怪。shellcheck在下面的第 2 行報告了這一點。
將陣列分配給字串!分配為陣列,或使用 * 而不是 @ 來連接。shellcheck(SC2124)
在 POSIX sh 中,未定義字串索引。外殼檢查(SC3057)
當我嘗試像通過 shell 那樣使用引數集執行腳本時,出現錯誤。
#!/bin/sh
LINK=${@:$OPTIND:1}
echo "$LINK"
$ ./test.sh foo
./test.sh: 2: Bad substitution
我建議像這樣分配變數。
#!/bin/sh
LINK="$1"
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397128.html
