Linux 为什么我的shell命令在提示符下工作,而不是作为bash脚本工作?
bash脚本编程新手。我对shell脚本非常熟悉。我为一个客户端的提要编写了这个文本转换脚本。并提取我想要的url和文章标题。太棒了Linux 为什么我的shell命令在提示符下工作,而不是作为bash脚本工作?,linux,bash,shell,Linux,Bash,Shell,bash脚本编程新手。我对shell脚本非常熟悉。我为一个客户端的提要编写了这个文本转换脚本。并提取我想要的url和文章标题。太棒了 echo $(var=$(curl -L website.com/news)) | grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var | result=$(sed 's/"/\n/g' | sed 's/ \//\n\//g' | se
echo $(var=$(curl -L website.com/news)) |
grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var |
result=$(sed 's/"/\n/g' | sed 's/ \//\n\//g' | sed 's/>//g') ; let this=0 ; echo "$result" | while read line ; do if ((this % 2 == 0 )) ; then echo website.com/news$line ; else echo $line ; fi ; let this+=1 ; done
echo$(var=$(curl-L-website.com/news))|
grep-Po'/g');让这个=0;读取行时回显“$result”;如果((此%2==0)),则执行该操作;然后echo网站/news$line;否则回声线;fi;让这个+=1;完成
当我试图将其解压缩到一个文件并使用bash或sh myThing.sh运行它时,它根本不起作用。echo的唯一内容是“webiste.com/news”,当我尝试echo$this时,得到的只是1。我做错了什么
#!/bin/bash
echo $(var=$(curl -L website.com/news)) |
grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var |
result=$(sed 's/"/\n/g' | sed 's/ \//\n\//g' | sed 's/>//g')
let this=0
echo "$result" | while read line
do
if ((this % 2 == 0 ))
then
echo website.com/news$line
else
echo $line
fi
let this+=1
done
#/bin/bash
echo$(var=$(curl-L website.com/news))|
grep-Po'/g')
让这个=0
读取行时回显“$result”
做
如果((此%2==0))
然后
echo网站/news$line
其他的
回音$线
fi
让这个+=1
完成
编辑:
#!/bin/bash
var=$(curl -L linux.com/news)
select=$(grep -Po '<h3 class="article-list__title"><a href="\K[^<]+' <<< $var)
result=$(sed 's/"/\n/g' | sed 's/ \//\n\//g' | sed 's/>//g')
let this=0
echo "$result" | while read line
do
if ((this % 2 == 0 ))
then
echo website.com/news$line
else
echo $line
fi
let this+=1
done
#/bin/bash
var=$(curl-L linux.com/news)
select=$(grep-Po'//g')
让这个=0
读取行时回显“$result”
做
如果((此%2==0))
然后
echo网站/news$line
其他的
回音$线
fi
让这个+=1
完成
这个答案解决了OP的特定问题,但为了解决“为什么我的shell命令在提示符下工作,而不是作为bash脚本?”这个问题,通常在注释中提供了一个很好的答案:您可能没有运行该确切的命令,或者该命令“有效”,因为您的shell状态正在以您认为“有效”的方式影响事情,而您的脚本没有该状态。请尝试启动一个全新的shell会话,看看该命令本身是否对您有效
echo$(var=…)
将为变量$var
分配一个值,但不会输出任何内容,因此echo
命令将只打印一个换行符
此外,由于对$var
的赋值发生在$(…)
(命令替换)内部,因此替换内部的命令只在子shell中运行,因此调用shell中将不会定义$var
。(子shell是包含当前shell环境副本的子进程,但不能修改当前shell环境) 更一般地说,您不能在管道内有意义地定义变量——它们既不会对其他管道段可见,也不会在管道完成后可见。[1] 您的[原始]命令能够工作的唯一原因是,
$var
在shell中有一个预先存在的值。
事实上,如果您通过here字符串向grep
提供输入(这个答案解决了OP的特定问题,但是要解决“为什么我的shell命令在提示符下工作,而不是作为bash脚本?”这一问题,通常在注释中提供了一个很好的答案:
您可能没有运行该确切的命令,或者该命令“有效”,因为您的shell状态正在以您认为“有效”的方式影响事情,而您的脚本没有该状态。请尝试启动一个全新的shell会话,看看该命令本身是否对您有效
echo$(var=…)
将为变量$var
分配一个值,但不会输出任何内容,因此echo
命令将只打印一个换行符
此外,由于对$var
的赋值发生在$(…)
(命令替换)内部,因此替换内部的命令只在子shell中运行,因此调用shell中将不会定义$var
。
(子shell是包含当前shell环境副本的子进程,但不能修改当前shell环境)
更一般地说,您不能在管道内有意义地定义变量——它们既不会对其他管道段可见,也不会在管道完成后可见。[1]
您的[原始]命令能够工作的唯一原因是,$var
在shell中有一个预先存在的值。
事实上,如果您通过一个here字符串()向grep
提供输入,那么这一行是完全错误的。您试图通过管道传递每个进程的标准输出,而这些管道中除了标准错误外,没有一个打印任何内容
echo $(var=$(curl -L website.com/news)) | grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var | result=$(sed 's/"/\n/g' | sed 's/ \//\n\//g' | sed 's/>//g')
上面的代码将只打印标准错误,这是标准输出以外的一个单独的流。标准输出被分配给$var
。但是,您正在尝试将标准输出传递给下一个进程,此时它只是一个换行符
grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var
我不打算优化您的脚本。这更像是一个建议的解决方案。您的问题有一个更全面的答案为什么我的shell命令在提示符下工作,而不是作为bash脚本工作?的答案是。这一行完全错误。如果没有,您正试图通过管道传递每个进程的标准输出除了标准误差,他们中没有人打印过任何东西
echo $(var=$(curl -L website.com/news)) | grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var | result=$(sed 's/"/\n/g' | sed 's/ \//\n\//g' | sed 's/>//g')
上面的代码将只打印标准错误,这是标准输出以外的一个单独的流。标准输出被分配给$var
。但是,您正在尝试将标准输出传递给下一个进程,此时它只是一个换行符
grep -Po '<h3 class="article-link"><a href="\K[^<]+' <<< $var
我不打算优化您的脚本。这更像是一个建议的解决方案。您的问题有一个更全面的答案为什么我的shell命令在提示符下工作,而不是作为bash脚本?的答案是。当您为变量赋值时,它在赋值操作期间不会打印任何值。因此s行echo$(var=$(curl-lwebsite.com/news))
不打印任何内容
result=$(curl -L website.com/news | grep -Po '<h3 class="article-link"><a href="\K[^<]+'| sed 's/"/\n/g' | sed 's/ \//\n\//g' | sed 's/>//g')