Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么我的shell命令在提示符下工作,而不是作为bash脚本工作?_Linux_Bash_Shell - Fatal编程技术网

Linux 为什么我的shell命令在提示符下工作,而不是作为bash脚本工作?

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

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' | 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')