【问题标题】:Bash - assign variables to yad values - sed usage in for loopBash - 将变量分配给 yad 值 - for 循环中的 sed 用法
【发布时间】:2018-08-19 01:28:12
【问题描述】:

在下面的代码中,我尝试将变量分配给两个 yad 值 Radius 和 Amount。

这可以通过将 yad 值打印到文件来使用 awk 来完成,但如果可以的话,我想避免这种情况。

使用 sed 为字符串(即两个 yad 值)分配一个变量并根据需要修剪字符。然而,脚本停在这一行;

radius=$(sed 's|[amount*,]||g')

两个问题

  1. 有没有更好的方法来解决这个问题?和

  2. 为什么脚本没有完成?我一直无法弄清楚语法。

编辑:不需要循环并使用 sed 语法

  #!/bin/bash
    #ifs.sh

        values=`yad --form --center --width=300 --title="Test" --separator=' ' \
            --button=Skip:1 \
            --button=Apply:0 \
            --field="Radius":NUM \
                '0!0..30!1!0' \
            --field="Amount":NUM \
                '0!0..5!0.01!2'`

            radius=$(echo "$values" | sed 's|[amount*,]||g')
            amount=$(echo "$values" | sed 's/.a://')

            if [ $? = 1 ]; then
            echo " " >/dev/null 2>&1; else

            echo "Radius = $radius"
            echo "Amount = $amount"
        fi
    exit

替代品

# with separator
#  radius="${values%????????}"
#  amount="${values#????????}"

# without separator
#   radius=$(echo "$values" | sed s'/........$//')
#   amount=$(echo "$values" | sed 's/^........//')

【问题讨论】:

  • 我不知道yad是什么或做什么,但是radius=$(sed 's|[amount*,]||g')没有指定要操作什么数据,所以它默认永远等待你通过键盘输入数据。您可以使用radius=$(echo "$i" | sed 's|[amount*,]||g') 为其提供一些数据,这样它就不会等待您手动输入。我不知道你希望这个 sed 做什么,我猜它不会这样做。
  • 谢谢。当然...... sed 需要数据才能使用。 for 循环来自另一篇文章,没有必要。在下面回答。
  • yad 是 bash 脚本的图形界面
  • 顺便说一句,正则表达式[amount,*] 几乎肯定不会做你想要或相信的事情。它匹配不是(换行符或)a 或 m 或 o 或 u 或 n 或 t 或 , 或 * 的单个字符。可能您应该用圆括号替换方括号,尽管您随后需要使用 sed -r 或 sed -E 或了解如何进一步修改特定 sed 版本的正则表达式方言的表达式。
  • 谢谢。我现在明白了……这是一个非常有用的帖子,全面。非常感谢响应者所花费的耐心和时间。

标签: bash sed yad


【解决方案1】:

这比你想象的要容易:

$ values=( $(echo '7.000000 0.100000 ') )
$ echo "${values[0]}"
7.000000
$ echo "${values[1]}"
0.100000

将$(echo '7.000000 0.100000 ') 替换为yad ...,这样脚本将是:

values=( $(yad --form --center --width=300 --title="Test" --separator=' ' \
        --button=Skip:1 \
        --button=Apply:0 \
        --field="Radius":NUM \
            '0!0..30!1!0' \
        --field="Amount":NUM \
            '0!0..5!0.01!2') )

if [ $? -eq 0 ]; then
    echo "Radius = ${values[0]}"
    echo "Amount = ${values[1]}"
fi

【讨论】:

    【解决方案2】:

    编辑:根据@Ed Morton 更改答案

    #!/bin/bash
    #ifs.sh
    
    values=($(yad --form --center --width=300 --title="Test" --separator=' ' \
                --button=Skip:1 \
                --button=Apply:0 \
                --field="Radius":NUM \
                    '0!0..30!1!0' \
                --field="Amount":NUM \
                    '0!0..5!0.01!2'))
    
    if [ $? -eq 0 ]; then
        radius="${values[0]}"
        amount="${values[1]}"
    fi
    exit
    

    bash -x 输出

    + '[' 0 -eq 0 ']'
    + radius=7.000000
    + amount=1.000000
    + exit
    

    【讨论】:

    • 你不需要 echo 和 sed - radius="${values%????????}"; amount="${values#????????}"。你希望echo " " >/dev/null 2>&1 能做什么?据我所知,它没有任何用处。你认为if [ $? = 1 ] 在测试什么?如果您认为这是 yad 的结果 - 它不是。
    • 顺便说一句,如果你有分隔符,这个任务很可能会更简单一些,但你从来没有向我们展示过带有分隔符的 yad 的输出是什么样子的......
    • @Ed Morton。谢谢-我从两位响应者那里学到了一些东西-添加了分隔符并且您的方法运行良好-更改了答案以包含它并添加了 bash -x 输出。我将不得不考虑您的 cmets 关于测试 yad 输出和跳过该过程的选项。
    • 不客气。你的成功测试仍然在错误的地方,假设你想测试执行yad 的结果而不是amount=... 的结果,并且你仍然有 echo > /dev/null 什么都不做。我会发布一个答案。
    • 这已经成功了——“用 yad 替换 $(echo '7.000000 0.100000 ')”。我应该像你一样定义变量 - 一个数组?然后在检查非零值后,脚本将打印这些值,否则,终止/移动到下一个进程。如果这是一个准确的总结?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2019-11-29
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多