Linux 我如何删除“&引用;在shell循环的末尾?

Linux 我如何删除“&引用;在shell循环的末尾?,linux,shell,unix,Linux,Shell,Unix,我是shell脚本语言的新手 我试着写这个循环 for ((i=100; i>0; i--)); do echo -n "\" Hello $i \" , "; done 对于结果,它将显示 “你好100”,“你好99”。。。“Hello 1”将commma的回波与其余部分分开,并设置if条件以检查最后一次重复 for ((i=100; i>0; i--)); do echo -n "\" Hello $i \""; if ($i!=1) then echo -n "

我是shell脚本语言的新手

我试着写这个循环

for ((i=100; i>0; i--));
do
echo -n "\" Hello $i \" , ";
done
对于结果,它将显示


“你好100”,“你好99”。。。“Hello 1”将commma的
回波
与其余部分分开,并设置if条件以检查最后一次重复

for ((i=100; i>0; i--));
do
  echo -n "\" Hello $i \"";
  if ($i!=1) then
   echo -n ","; 
  endif
done
使用
sed
更换的单线解决方案:

for i in {100..1}; do echo -n "\" Hello $i \" , "; done | sed 's/,\s*$//g'
{100..1}
-从
100
1

sed's/,\s*$//g'
-将用空字符串替换文本末尾的最后一个逗号


示例性范围
{10..1}
的输出如下:

" Hello 10 " , " Hello 9 " , " Hello 8 " , " Hello 7 " , " Hello 6 " , " Hello 5 " , " Hello 4 " , " Hello 3 " , " Hello 2 " , " Hello 1 "
在项目前打印分隔符,分隔符初始为空,第一次迭代后无条件设置。它是明确的、易于理解的、高效的

sep=
for ((i=100; i>0; i--)); do
  echo -n "$sep\" Hello $i \""
  sep=" , "
done
正如@charlesduff所建议的,您可以使用printf(bash内置)而不是echo-n

sep=
for ((i=100; i>0; i--)); do
  printf "$sep\" Hello $i \""
  sep=" , "
done
备选(延迟)答案,您不需要删除最后一个
,但您可以使用
粘贴
命令来构建输出,如:

for ((i=10; i>0; i--));
do
    printf '"Hello %d"\n' $i;
    #or     echo "\"Hello $i\""
done | paste -sd, -
输出:

"Hello 10","Hello 9","Hello 8","Hello 7","Hello 6","Hello 5","Hello 4","Hello 3","Hello 2","Hello 1"
或者只是:

printf '"Hello  %d"\n' {10..1} | paste -sd, -

使用相同的输出

我尝试了这个方法,但它显示“Hello 100”[I!=1]:命令不是found@ChanathipChuayboonchum这是什么样的贝壳?它是不是
bash
?因为我给出的
if
使用的是
bash
语法…我使用linux shell脚本。if需要括号中的空格
[I!=1]
。特别是对于这样简单的if,如果你能像
[I!=1]&echo-n那样做,“
哦,天哪,它成功了!但它仍然有“在1之后删除一些本来不应该在那里的东西是一种不好的做法。我建议不要在最后一行后面打印逗号。@hek2mgl,在每次迭代中执行
if
条件不是好的做法(在大范围的情况下,比如说
{10000..1}
),如果只是删除尾部的逗号,那么在每次迭代中执行
检查不是好的做法,用正则表达式检查所有输出也不好。
printf“%s”Hello%s““$sep”“$i”
比依赖
echo-n
更好,因为
echo
的POSIX规范使
-n
的行为完全未定义,而不是在这里定义您期望的行为(在没有打印换行符的情况下)。请参阅POSIX规范,特别是应用程序用法和基本原理部分。