【问题标题】:How to pick up all variables within double quotes and execute them in shell script如何在双引号中提取所有变量并在 shell 脚本中执行它们
【发布时间】:2022-01-23 08:01:46
【问题描述】:
  1. 我有以下字符串,其中包含一些定义以及一个名为 -ow 的变量。

    test_file='+define+WHAT_IS_IT +define+HOW_IS_IT -ow ""set_app=" "set_map=+define+HOW +define+WHERE""'

  2. 想要捕获 -ow 旁边的双引号内列出的所有变量。

  3. 并循环遍历双引号内的所有元素并执行它们。

  4. 尝试了下面的代码,但我无法用双引号捕获所有元素并执行它们。

    #!/bin/bash -f
    
    test_file='+define+WHAT_IS_IT +define+HOW_IS_IT -ow ""set_app=" "set_map=+define+HOW +define+WHERE""'
    
    echo "------------------"
    echo "$test_file"
    echo "------------------"
    
    arr_t=(${test_file}); arr=()
    for (( idx=0; idx <= ${#arr_t[@]}; idx++ ));
    do 
     echo "${arr_t[idx]}"
    
     if [[ "${arr_t[idx]}" =~ "-ow" ]]; then
         echo "Found ow! Next Value is: ${arr_t[idx+1]}"
    
         # declare -a str_arr=(${arr_t[idx+1]})
         # for val in ${str_arr[@]}; do
         #   eval $a
         # done
     fi 
    done
    
    echo "value of set_app: $set_app"
    echo "value of set_map: $set_map"
    
  5. 下面是我得到的输出。

    ------------------
    +define+WHAT_IS_IT +define+HOW_IS_IT -ow ""set_app=" "set_map=+define+HOW +define+WHERE""
    ------------------
    +define+WHAT_IS_IT
    +define+HOW_IS_IT
    -ow
    Found ow! Next Value is: ""set_app="
    ""set_app="
    "set_map=+define+HOW
    +define+WHERE""
    
    value of set_app: 
    value of set_map: 
    
  6. 基本上输出需要是那些需要在当前执行的shell空间中设置双引号的变量,当我打印set_app和set_map的值时它需要反映。

我是否遗漏了关于双引号的任何内容?或数组?请指教。

【问题讨论】:

  • 哪个虐待狂定义了这种字符串格式?
  • @chepner haha​​.. 那是可编辑的.. 主要是如何在双引号甚至单引号或我们可以使用的任何其他字符串格式中提取变量。想要将 -ow 之后定义但在任何分隔符内的所有变量分组。只是为了区分变量的传递,使用了双引号等。但我需要使用我也可以使用的任何其他符号或分隔符。没有限制,但最好是双引号。
  • @Vino 我不确定您要做什么,但为什么不直接将值存储为数组?也知道分词不尊重值内的引号。考虑阅读手册。
  • @konsolebox 基本上这些输入来自一个文件。将有一个文件逐行包含所有详细信息。所以,我想解析一整行,然后如果我找到 switch -ow 那么我想获取双引号中提供的所有值并执行它们,即基本上覆盖当前 shell 提示符中的值。哦,好吧..我将在文件本身中拥有的格式可以作为数组使用并执行它们是你所说的吗?
  • 嗯,我不知道该建议什么。您的行在双引号内有一个双引号,这是没有意义的:""set_app=" "set_map=+define+HOW +define+WHERE""。无论如何,正确的做法可能是使用真正的解析器。

标签: bash shell


【解决方案1】:

这个概念是有问题的,但回答你的问题这个技巧可能会有所帮助

test='""set_app=" "set_map=+define+HOW +define+WHERE""'
remove_quotes=${test//\" \"/_SPACE1_}
remove_quotes=${remove_quotes//\"}
remove_space=${remove_quotes// /_SPACE2_}
arr=(${remove_space//_SPACE1_/ })

for item in "${arr[@]}"; do
    echo "\"${item//_SPACE2_/ }\""
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多