如何为bash文件中的每一行运行命令?

时间:2019-09-17 12:56:41

标签: bash

我运行

php --version | grep -m1 -i php
/usr/bin/php --version | grep -m1 -i php 
python3 --version | grep python 
python --version | grep python 
node --version | grep  node 
npm --version | grep npm 
composer --version | grep composer 
pip3 --version | grep pip 
ruby --version | grep  ruby 
bower --version | grep bower 
gulp --version | grep gulp 
brew --version 
redis-server --version | grep redis 
redis-cli --version | grep redis

我明白了,这并不能在所有行中运行

➜  Desktop bash versions.sh 
PHP 7.3.8 (cli) (built: Aug  6 2019 23:17:07) ( NTS )
PHP 5.6.30 (cli) (built: Oct 29 2017 20:30:32) 
Python 2.7.10
pip 19.1.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin16]
Homebrew 2.1.11
Homebrew/homebrew-core (git revision 15f5d; last commit 2019-09-11)
Homebrew/homebrew-cask (git revision 0960b; last commit 2019-09-11)
redis-cli 5.0.5
➜  Desktop 

3 个答案:

答案 0 :(得分:2)

您可以使用read代替xargs循环:

<yourfile.txt xargs -n 1 sh -c '"$0" --version 2>&1 | grep "$0"'
  • <yourfile.txt xargs:一次将yourfile.txt的内容作为一个参数分配给以下命令。
  • -n 1:一次争论一个。
  • sh -c:该命令是一个sh shell,其中-c执行一个内联脚本。
  • '"$0" --version 2>&1 | grep "$0"':内嵌shell脚本:
    • "$0" --version:执行xargs从文件中提供的参数值作为命令名称。
    • 2>&1:将stderr重定向到stdout以处理将其版本打印到stderr的命令。
    • | grep "$0":通过管道传递到grep并以文本形式搜索参数值。

答案 1 :(得分:1)

应该可以:

while read -r LINE
do
    $LINE
done < your_file_name_here

例如,您可能要检查所有输出是否都到达STDOUTpython2 --versionpython3 --version,例如,它们在那里表现出不同的行为。

编辑1:正如Bayou指出的那样,使用done << your_file_name_here(进行相应调整)更有效。 编辑2:正如本杰明指出的,它应该是<而不是<<,后者对于HEREDOC很有用。

答案 2 :(得分:0)

这可能不是我所提问题的直接答案,但仍然可以发布

我发现了自己的错误,但我并没有特别做错任何事情。除非我错过了-m1 i,它从输出中获取第一行,且不区分大小写。

我做了以下工作,并且工作正常。我可以使用bash versions.sh运行它。感谢所有人为我指出正确的方向。

echo -n "php: "; php --version | grep -m1 -i php
echo -n "php56: "; /usr/bin/php --version | grep -m1 -i php 
echo -n "python3: ";python3 --version | grep -m1 -i python 
echo -n "python: "; python --version | grep -m1 -i python 
echo -n "node: ";node --version 
echo -n "npm: ";npm --version
echo -n "composer: ";composer --version | grep -m1 -i composer 
echo -n "pip3: ";pip3 --version | grep -m1 -i pip 
echo -n "ruby: ";ruby --version | grep -m1 -i ruby 
echo -n "bower: "; bower --version 
echo -n "gulp: ";gulp --version 
echo -n "brew: ";brew --version | grep -m1 -i brew 
echo -n "redis-server: ";redis-server --version | grep -m1 -i redis 
echo -n "redis-cli: ";redis-cli --version | grep -m1 -i redis
echo -n "laravel: ";laravel --version
echo -n "vapor: "; vapor --version
echo -n "valet: "; valet --version