關於命令列引數中的引號會被bash去掉的問題

2021-10-02 04:06:53 字數 2510 閱讀 8157

最初的想法是接受命令行引數,稍作處理後交由其他程式處理,但是bash會將命令列引數中的引號去掉:

問題描述:shell解析命令列引數後(去掉引號)再傳遞給cli程式

見:有關 python 獲取命令列引數中單引號的問題

比如:

git config --global filter.lfs.smudge "git-lfs smudge -- %f"

# 程式收到的:

git config --global filter.lfs.smudge git-lfs smudge -- %f

可以在雙引號外面加單引號(這樣會保留裡面的雙引號)、單引號外面加雙引號(保留裡面的單引號)、或者直接轉義,比如:

'filter.lfs.smudge "git-lfs smudge -- %f"'

# 程式收到的:

filter.lfs.smudge "git-lfs smudge -- %f"

"'git-lfs smudge -- %f'"

# 程式收到的:

'git-lfs smudge -- %f'

filter.lfs.smudge \"git-lfs smudge -- %f\"

# 程式收到的:

filter.lfs.smudge "git-lfs smudge -- %f"

但git可以:

git config --global 'filter.lfs.smudge "git-lfs smudge -- %f"'

error: invalid key: 'filter.lfs.smudge

暫不清楚怎麼做到的

在linux中可以使用' %q' "$@"轉換為shell可以重用的輸入格式

how to keep quotes in bash arguments?

preserve quotes in bash arguments

比如使用bash -c "$(printf ' %q' "$@")"(寫在shell指令碼中)後,git命令可以正常執行

# filter.lfs.smudge "git-lfs smudge -- %f" 變為

# filter.lfs.smudge git-lfs\ smudge\ --\ %f

$ ./test3.sh git config --global filter.lfs.smudge "git-lfs smudge -- %f"

git config --global filter.lfs.smudge git-lfs\ smudge\ --\ %f

# --pretty=format:"%h %ad" 變為

# --pretty=format:%h\ %ad

$ ./test3.sh git log --pretty=format:"%h %ad" --date=short

git log --pretty=format:%h\ %ad --date=short

5bdd3d9 2019-09-17

# 或者直接在命令列使用format後的形式,也可以正常執行相應命令

$ git log --pretty=format:%h\ %ad --date=short

5bdd3d9 2019-09-17

$ git config --global filter.lfs.smudge git-lfs\ smudge\ --\ %f

$ git lfs env

git-lfs/2.9.1 (github; linux amd64; go 1.13.1)

git version 2.17.1

……git config filter.lfs.process =

"git-lfs filter-process"

git config filter.lfs.smudge =

"git-lfs smudge -- %f"

git config filter.lfs.clean =

"git-lfs clean -- %f"

因此在linux上執行的程式中,可以手動將引數中的空格及其他特殊符號前加轉義符replace(" ", "\\ ")

關於有關 python 獲取命令列引數中單引號的問題中提到的python的input()內建函式,測試如下,可以保留引號,但具體使用未嘗試

>>> a = input(

"input:"

)input:"git-lfs smudge -- %f"

>>> type

(a)'str'>

>>> print(a)

"git-lfs smudge -- %f"

shell command line quoting mechanisms

命令列引數的作用 go 命令列引數

使用 flag 包獲取命令列引數,控制程式執行 主要函式 flag.string flag.strin ar flag.int flag.intvar flag.float64 flag.float64var flag.bool flag.boolvar p2,p3 p1 命令列引數標誌,flag ...

linux中解析命令列引數

linux 中解析命令列引數 getopt long用法 getopt long支援長選項的命令列解析,使用man getopt long,得到其宣告如下 include int getopt long int argc,char const argv,const char optstring,co...

LINUX中解析命令列引數

author liujun time 2013 3 18 在linux中你輸入比如 insert ll kk mm qq 你如何得到ll kk mm qq,這是需要用到命令列的解析,來分離字串。有三種方法 第一 getopt long支援長選項的命令列解析,使用man getopt long,得到其...