标签: shell-script

运行“bash script.sh”和“./script.sh”有什么区别?

如果 script.sh 只是一些典型的东西

#!/bin/bash
echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)

有没有首选的方式来运行脚本?我认为您首先必须对其进行 chmod 使其成为可执行文件?

bash executable shell-script

59
推荐指数
4
解决办法
5万
查看次数

Bash if 语句 [: missing `]' 错误

我在使用 bash 时遇到问题。我试图将命令放入if语句中,然后将其与字符串进行比较。

这完美地工作。

echo $(ipcs | grep Shared | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

当我把它放在if声明中时,我遇到了一些问题。

$ if [ "$(ipcs | grep Shared | awk '{print $2}')" -eq "Shared"]; then
  echo expression evaluated as true;
else
  echo expression evaluated as false;
fi
bash: [: missing `]'
expression evaluated as false

$ if [ "$(ipcs | grep Shared | awk '{print $2}')" = "Shared"]; then
  echo expression evaluated as true;
else
  echo expression evaluated as false;
fi
bash: [: …
Run Code Online (Sandbox Code Playgroud)

bash shell-script test

59
推荐指数
1
解决办法
16万
查看次数

如何在条件语句中退出脚本?

我正在编写一个 bash 脚本,如果用户不是 root,我想在其中退出。条件工作正常,但脚本不退出。

[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Run Code Online (Sandbox Code Playgroud)

我试过使用&&而不是,;但都不起作用。

shell scripting bash shell-script

57
推荐指数
2
解决办法
16万
查看次数

在多个平台上找到正确的 tmp 目录

I have a script that needs to create temporary files for its work, and clean up after itself. My question is about finding the right base directory for the temporary files.

The script needs to work on multiple platforms: Git Bash (Windows), Solaris, Linux, OSX. On each platform, the preferred temp directory is expressed differently:

  • Windows: %TMP% (and possibly %TEMP%)
  • OSX: $TMPDIR
  • Linux, UNIX: supposed to be $TMPDIR but appears to be unset on multiple systems I tried

So …

directory shell-script tmp

57
推荐指数
3
解决办法
3万
查看次数

shell 中的 "..."、'...'、$'...' 和 $"..." 引号之间有什么区别?

有时候,我看到shell脚本使用所有的引用一些文字,这些不同的方式:"..."'...'$'...',和$"..."。为什么有这么多不同类型的引用被使用?

他们的行为是否有所不同或影响了我在他们内部可以做的事情?

shell bash zsh shell-script quoting

57
推荐指数
1
解决办法
7660
查看次数

我应该关心不必要的猫吗?

许多命令行实用程序可以从管道或文件名参数中获取输入。对于长 shell 脚本,我发现以 a 开头的链cat使其更具可读性,尤其是在第一个命令需要多行参数的情况下。

相比

sed s/bla/blaha/ data \
| grep blah \
| grep -n babla
Run Code Online (Sandbox Code Playgroud)

cat data \
| sed s/bla/blaha/ \
| grep blah \
| grep -n babla
Run Code Online (Sandbox Code Playgroud)

后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否每秒运行一次?可读性的差异并不大。

performance pipe shell-script cat

56
推荐指数
4
解决办法
6748
查看次数

nvm 命令在 bash 脚本中不可用

我正在尝试构建一个脚本nvm,最终将在其中安装节点。
我已经安装nvm了 cURL。我看到了.profileor.bashrc文件中的修改(都有效),并且nvm在 bash 提示符下键入时,它显示了可用的选项等。
因此 nvm 有效。我可以手动安装节点,但是只要我将nvm命令放入 shell 脚本中:

nano test.sh

#!/bin/bash
nvm
Run Code Online (Sandbox Code Playgroud)

并运行它:

chmod 755 test.sh
./test.sh
Run Code Online (Sandbox Code Playgroud)

我得到:

./test.sh: line 2: nvm: command not found
Run Code Online (Sandbox Code Playgroud)

如果它找不到nvm,我什至不必去想

nvm ls-remote 
Run Code Online (Sandbox Code Playgroud)

或者

nvm install ...
Run Code Online (Sandbox Code Playgroud)

我安装了 Ubuntu 14.04,Bash 是我的 shell。

bash shell-script software-installation node.js

55
推荐指数
1
解决办法
3万
查看次数

kill 、 pkill 和 killall 有什么区别?

我对killcommand很熟悉,大多数时候我们只是用来kill -9强行杀死一个进程,还有很多其他信号可以与kill. 但我想知道pkilland的用例是什么killall,如果已经有一个 kill 命令。

在他们的实现中做pkillkillall使用kill命令吗?我的意思是他们只是包装器,kill或者他们有自己的实现?

我还想知道pgrepcommand如何从进程名称中获取进程 ID。

所有这些命令都使用相同的底层系统调用吗?从性能的角度来看有什么区别,哪个更快?

linux bash kill shell-script

55
推荐指数
2
解决办法
5万
查看次数

如何在 zsh 中正确收集一系列行

我认为以下内容会将 的输出分组为my_command一组行:

IFS='\n' array_of_lines=$(my_command);
Run Code Online (Sandbox Code Playgroud)

使得$array_of_lines[1]要提到的第一行中的输出my_command$array_of_lines[2]以在第二,等等。

但是,上面的命令似乎效果不佳。它似乎也分割了my_command字符周围的输出n,正如我已经检查过的那样print -l $array_of_lines,我相信它会逐行打印数组的元素。我还检查了这一点:

echo $array_of_lines[1]
echo $array_of_lines[2]
...
Run Code Online (Sandbox Code Playgroud)

在第二次尝试中,我认为添加eval可能会有所帮助:

IFS='\n' array_of_lines=$(eval my_command);
Run Code Online (Sandbox Code Playgroud)

但我得到了与没有它完全相同的结果。

最后,按照在 zsh 中带有空格的 List 元素上的答案,我还尝试使用参数扩展标志而不是IFS告诉 zsh 如何拆分输入并将元素收集到数组中,即:

array_of_lines=("${(@f)$(my_command)}");
Run Code Online (Sandbox Code Playgroud)

但我仍然得到相同的结果(分裂发生在n

有了这个,我有以下问题:

一季度。在行数组中收集命令输出的“正确”方法是什么?

Q2。如何指定IFS仅在换行符上拆分?

Q3。如果我在上面的第三次尝试中使用参数扩展标志(即使用@f)来指定拆分,那么 zsh 会忽略 的值IFS吗?为什么上面不起作用?

zsh shell-script

54
推荐指数
2
解决办法
3万
查看次数

unix shell 脚本的文件扩展名

在维基百科上,.sh的文章说:

有关 .sh 文件扩展名类型,请参阅Bourne shell

其他unix shell怎么样?

我知道在文件中 使用shebang来指示要执行的解释器,但我想知道:

  • 文件扩展名与无文件扩展名的优缺点是什么?

scripting conventions shell-script filenames files

54
推荐指数
5
解决办法
12万
查看次数