如果 script.sh 只是一些典型的东西
#!/bin/bash
echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)
有没有首选的方式来运行脚本?我认为您首先必须对其进行 chmod 使其成为可执行文件?
我在使用 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 脚本,如果用户不是 root,我想在其中退出。条件工作正常,但脚本不退出。
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Run Code Online (Sandbox Code Playgroud)
我试过使用&&而不是,;但都不起作用。
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:
%TMP% (and possibly %TEMP%)$TMPDIR$TMPDIR but appears to be unset on multiple systems I triedSo …
有时候,我看到shell脚本使用所有的引用一些文字,这些不同的方式:"...",'...',$'...',和$"..."。为什么有这么多不同类型的引用被使用?
他们的行为是否有所不同或影响了我在他们内部可以做的事情?
许多命令行实用程序可以从管道或文件名参数中获取输入。对于长 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)
后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否每秒运行一次?可读性的差异并不大。
我正在尝试构建一个脚本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。
我对killcommand很熟悉,大多数时候我们只是用来kill -9强行杀死一个进程,还有很多其他信号可以与kill. 但我想知道pkilland的用例是什么killall,如果已经有一个 kill 命令。
在他们的实现中做pkill和killall使用kill命令吗?我的意思是他们只是包装器,kill或者他们有自己的实现?
我还想知道pgrepcommand如何从进程名称中获取进程 ID。
所有这些命令都使用相同的底层系统调用吗?从性能的角度来看有什么区别,哪个更快?
我认为以下内容会将 的输出分组为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吗?为什么上面不起作用?
在维基百科上,.sh的文章说:
有关 .sh 文件扩展名类型,请参阅Bourne shell。
其他unix shell怎么样?
我知道在文件中 使用shebang来指示要执行的解释器,但我想知道:
shell-script ×10
bash ×6
scripting ×2
shell ×2
zsh ×2
cat ×1
conventions ×1
directory ×1
executable ×1
filenames ×1
files ×1
kill ×1
linux ×1
node.js ×1
performance ×1
pipe ×1
quoting ×1
test ×1
tmp ×1