如何停止多行不应在 Shell 脚本中返回

Posted

技术标签:

【中文标题】如何停止多行不应在 Shell 脚本中返回【英文标题】:How to Stop Mutiple Line should not return in Shell Script 【发布时间】:2022-01-20 08:39:44 【问题描述】:

下面是我执行得到多行时的输出命令。

我的问题是我应该想要多行而不是脚本中需要单行

输出命令:- bash script.sh --username USERNAME --password PASSWORD --project "Test Project"

oxNjM5ODA2MTg5fQ.ea82ZkR5afv5uT0m6l8ttutOWCelPlxuyr4iU3VkZyU
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9617    0  9617    0     0   7166      0 --:--:--  0:00:01 --:--:--  7160
runId = 8a8094017dbc2780017dc6ea6a3c0780
taskStatus =  WAITING
Checking Status....
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9725    0  9725    0     0   7209      0 --:--:--  0:00:01 --:--:--  7214
Status = PROCESSING  Success Percent = 100.0  Total Tests = 75  Total Failed = 0  Run = 16
Checking Status....
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9725    0  9725    0     0   7155      0 --:--:--  0:00:01 --:--:--  7155
Status = PROCESSING  Success Percent = 100.0  Total Tests = 75  Total Failed = 0  Run = 16
Checking Status....
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9862    0  9862    0     0   7465      0 --:--:--  0:00:01 --:--:--  7465
Status = PROCESSING  Success Percent = 93.0  Total Tests = 75  Total Failed = 5  Run = 16
Checking Status....
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9862    0  9862    0     0   7493      0 --:--:--  0:00:01 --:--:--  7493
Status = PROCESSING  Success Percent = 93.0  Total Tests = 75  Total Failed = 5  Run = 16
Checking Status....
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9886    0  9886    0     0   7517      0 --:--:--  0:00:01 --:--:--  7517
Status = COMPLETED  Success Percent = 90.0  Total Tests = 75  Total Failed = 7  Run = 16

这是我的 shellscript

#!/bin/bash
# Begin
TEMP=$(getopt -n "$0" -a -l "username:,password:" -- -- "$@")

    [ $? -eq 0 ] || exit

    eval set --  "$TEMP"

    while [ $# -gt 0 ]
    do
             case "$1" in
                    --username) TS_USER="$2"; shift;;
                    --password) TS_PWD="$2"; shift;;
                    --) shift;;
             esac
             shift;
    done


curl -s -H "Content-Type: application/json" -X POST -d '"username": "'$TS_USER'", "password": "'$TS_PWD'"' https://example.com/login

echo "generated token is:" $token

curl --location --request POST "https://example.com/" --header "Authorization: Bearer "$token"" 

echo "runId =" $runId

if [ -z "$runId" ]
then
          echo "RunId = " "$runId"
          echo "Invalid runid"
          echo $(curl --location --request POST "https://example.com/" --header "Authorization: Bearer "$token"")
          exit 1
fi


taskStatus="WAITING"
echo "taskStatus = " $taskStatus



while [ "$taskStatus" == "WAITING" -o "$taskStatus" == "PROCESSING" ]
         do
                sleep 5
                 echo "Checking Status...."

                passPercent=$(curl --location --request GET "https://example.com/" --header "Authorization: Bearer "$token"")

                    

                        taskStatus="$array[0]"

                        echo "Status =" "$array[0]" " Success Percent =" "$array[1]"  " Total Tests =" "$array[2]" " Total Failed =" "$array[3]"



                if [ "$taskStatus" == "COMPLETED" ];then
            echo "------------------------------------------------"
                       
                        echo  "Run detail link https://example.com$array[7]"
                        echo "-----------------------------------------------"
                        echo "Job run successfully completed"
                        exit 0

                fi
        done

 
echo "Task Status = " $taskStatus
 exit 1
fi

echo "$(curl --location --request GET "https://example.com/" --header "Authorization: Bearer "$token"")"
exit 1

return 0

只需要单行我需要在上面的脚本中添加的内容,以便它应该只显示一行,即 状态.... 状态 = 已完成成功百分比 = 90.0 总测试 = 75 总失败 = 7 运行 = 16

【问题讨论】:

你在问如何关闭 curl 的进度日志吗? (手册页回答了这个问题)。如果应该只有一行输出,为什么还要多次调用 curl? 是的,只有我需要 然后将前两个curls 完全取出,在第三个上使用-s。或者如果您出于其他原因确实需要前两个,则将-s 添加到所有三个中,但重定向前两个的输出,以便不会向用户显示。 另外,这主要是How do I get curl to not show the progress bar?的重复 明确地说,somecommand 运行一些命令其输出到标准输出。你不需要写echo $(somecommand) 来写它的输出,因为输出是总是写的,除非你主动做一些事情(比如添加>/dev/null)来关闭它。并且echo $(somecommand) 在I just assigned a variable, but echo $variable shows something else! 中描述的方式也有问题。 【参考方案1】:

使用 curl 的 -s--silent 参数,您可以确保 curl 在静默或静默模式下运行。请注意,错误消息也会对您隐藏。

man curl 将显示该命令的所有可用选项。

【讨论】:

通过添加 -si 得到以下 3 行检查状态....状态 = 处理成功百分比 = 100.0 总测试 = 75 总失败 = 0 运行 = 17 检查状态....状态 = 处理成功百分比 = 100.0 总测试 = 75 总失败 = 0 运行 = 17 检查状态.... 状态 = 已完成成功百分比 = 90.0 总测试 = 75 总失败 = 7 运行 = 17 正如我所说我只需要显示 1 行 @user17201361,cmets 不保留行尾,因此您的评论并没有告诉我们您还有多少行输出。 如果这是用户所要求的,则该问题应作为How do I get curl to not show the progress bar? 的副本关闭,而不是被回答。请参阅How to Answer 的回答常见问题部分。 @CharlesDuffy 3 我得到的行输出以及关于你在上面发送的链接与我的情况不同,我已经在 curl 中添加了 -s,但我仍然得到 3 行输出 您的代码的哪一部分让您认为它不应该发出三行单独的输出? -s 只是告诉 curl 不要打印额外的状态;当服务器发送换行符时,它不会阻止它打印换行符。

以上是关于如何停止多行不应在 Shell 脚本中返回的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本编程小技巧-如何解决脚本中多行重定向结束符不用对齐到行首

Shell脚本单行和多行注释

深入讲解丨Shell脚本单行和多行注释

shell脚本编程小技巧——如何解决多行重定,变量不被shell解释

shell 脚本中的多行 awk 脚本

Shell | shell脚本单行注释与多行注释用法