2017-08-14 79 views
0

我对Bash相当新,所以请原谅我,但我正在构建一个Bash脚本,它可以接受可以有很多开关的用户输入命令。我需要编写一个从用户提供的命令中提取特定数据的函数。Bash - 在自定义分隔符后保存字符串以分隔变量

我似乎无法找到一种方法来拉动“-mode”后面的每个单词并将其推入某种数组或列表中。

这里是用户输入的命令可能看起来像一个例子:我尝试过使用awk -F“ - 模式”摆弄

/home/custom/function/that/accepts/a/billion/switches random_info random_info2 -worker vendor_schmo -switch_one -anotherOne -more_switches -optionTwo  -mode FOO -mode BAR -mode BAZ -mode BAG -mode DAT -mode RAR 

“{打印$ 1}”,并没有奏效。任何意见将不胜感激!

这里是从脚本片段,拉这个信息:

manualRunMain(){ 
    local command 
    manualRunHeaderPrint 
    echo 
    echo 
    echo 
    echo 
    lineBreakPrint 
    read -p "Enter your command here: " command 
    sleep .25 
    manualRun "$command" 
} 

manualRun(){ 
    manualRunHeaderPrint 
    jobRunSubHeaderPrint 
    pullModeNames "$1" 
} 

pullModeNames(){ 

} 
+0

欢迎使用堆栈溢出,您能否在代码标记中添加样本预期输出? – RavinderSingh13

+0

我不认为我需要任何输出,我只需要将每个“-mode”后面的每个单词都推送到一个数组中。我认为这足够了,我可以从那里拿走它。 –

+0

一般来说,您应该考虑遵循[BashFAQ#35](http://mywiki.wooledge.org/BashFAQ/035)中给出的实践来满足您的特定目的。你的命令给出的参数列表是**不作为字符串传递 - 而是作为字符串数组传递 - 并将它看作是字符串意味着你采用了一堆错误(例如,你失去区分'-foo“bar baz”'和'-foo bar baz'的能力)。 –

回答

2

您可以使用RS变量AWK告诉分割数据为单独的记录时,它得到-mode

s='/home/custom/function/that/accepts/a/billion/switches random_info random_info2 -worker vendor_schmo -switch_one -anotherOne -more_switches -optionTwo  -mode FOO -mode BAR -mode BAZ -mode BAG -mode DAT -mode RAR' 

printf '%s' "$s" | awk -v RS="-mode[[:space:]]*" 'NR>1' 
FOO 
BAR 
BAZ 
BAG 
DAT 
RAR 

填充阵列:

mapfile -t arr < <(printf '%s' "$s" | awk -v RS="-mode[[:space:]]*" 'NR>1') 

# examine array content 
declare -p arr 
declare -a arr=([0]="FOO" [1]="BAR" [2]="BAZ" [3]="BAG" [4]="DAT" [5]="RAR") 
+1

谢谢!太棒了。我会upvote你,但我没有声望去做:) –

+1

请注意,填充数组的命令是受字分割和glob扩展,所以如果你有一个参数'-mode'有空间''它会破裂。相反,你可以使用'mapfile':'mapfile -t arr <<(awk -v RS =“ - mode”'NR> 1 {print $ 1}'<<<“$ s”)' –

+0

@BenjaminW .: Very好点,但是如果有任何空格,那么即使'print $ 1'也只会打印第一部分。 – anubhava

0

我刚想出了bas与@anubhava具有相同的答案,但使用GNU grep而不是awk:

$ cmd="... -more_switches -mode FOO BAR -mode BAZ -mode BAG -mode CAT DAT HAT -mode RAR" 
$ mapfile -t modes < <(grep -oP -- '-mode \K.+?(?= -mode|$)' <<<"$cmd") 
$ printf "%s\n" "${modes[@]}" 
FOO BAR 
BAZ 
BAG 
CAT DAT HAT 
RAR