我正在使用Debian 10 (Buster) 并且在一个简单的 Bash 脚本中遇到错误。它所做的只是检查是否传入了一个参数,如果它是一个文件,只需回显该文件:
#!/usr/bin/bash
if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then
echo "$1"
fi
exit 1
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
line 2: syntax error near unexpected token `'$#''
line 2: `if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then'
Run Code Online (Sandbox Code Playgroud)
我已经尝试了围绕 的所有引号(“,',无引号)的组合$#,并且我总是使用我使用的引号类型获得这些错误消息的变体。我无法弄清楚它在寻找什么。
内有条件可以/etc/rc.local吗?我检查了很多问答,大多数人都建议chmod +x在上面运行,但我的问题不同。它实际上在没有条件的情况下对我有用,但没有其他条件。
#!/bin/sh
if [[ -e /usr/src/an-existing-file ]]
then
echo "seen" >> /etc/rclocalmadethis
fi
Run Code Online (Sandbox Code Playgroud)
这是我运行时看到的奇怪错误systemctl status rc-local.service:
rc.local[481]: /etc/rc.local: 3: /etc/rc.local: [[: not found
Run Code Online (Sandbox Code Playgroud)
这是我rc.local在完全相同的位置ls -lah /etc/:
-rwxr-xr-x 1 root root 292 Sep 19 09:13 rc.local
Run Code Online (Sandbox Code Playgroud)
我使用的是 Debian 10 标准版。
我正在尝试开发一个在 zsh 和 Bash 中运行(并且理想情况下执行相同的操作:-) 的脚本。问题是,在某个时刻,zsh 特定部分包含以 结尾的模式(N)。所以:this_pattern*(N)。在 zsh 中,如果没有匹配项,这会使模式扩展为空。
Bash 对此表示,“意外符号导致语法错误”。请注意,Bash 上的执行永远不会发生在 zsh 特定部分上,并且此错误消息是由解析代码引起的!
我能否以某种方式帮助 Bash 吃掉它,例如不解析它?
所以,当我忘记如何运行某个命令时,我一直试图养成在开始谷歌之前先查看手册页的习惯。
我今天正在查看 find 命令的手册页,并在概要部分中将命令的格式指定为:
SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
Run Code Online (Sandbox Code Playgroud)
这不是表明选项必须在路径之前,然后是表达式吗?或者概要没有指定顺序?
当我使用 find 时,虽然我必须在选项之前指定路径,如下所示:
find . -cmin -10 -ls
Run Code Online (Sandbox Code Playgroud) 我使用 Ubuntu 16.04 并且我有一个本地化文件,一个执行许多文件的文件,这是我将自己的 GitHub 项目下载到我的机器后得到的。
该文件包含一个 Bash 脚本,名为localize.sh. 我通过~/${repo}/localize.sh.
该文件包含许多行,所有行都具有相同的基本模式(见下文),以在子会话中执行所有相关文件。
这是该文件的实际内容:
#!/bin/bash
~/${repo}/apt/security.sh
~/${repo}/apt/lemp.sh
~/${repo}/apt/certbot.sh
~/${repo}/apt/misc.sh
~/${repo}/third-party/pma.sh
~/${repo}/third-party/wp-cli.sh
~/${repo}/conf/nginx.sh
~/${repo}/conf/php.sh
~/${repo}/conf/crontab.sh
~/${repo}/local/tdm.sh
Run Code Online (Sandbox Code Playgroud)
人们可以注意到重复的~/${repo}/模式。
这不是一个大问题,但减少这些冗余字符仍然会很好,因为这个文件应该变得更大。
实现 DRY 的最简单方法是什么(不要重复该代码的自己版本?
在这种情况下,我个人不想使用一条长线。
编辑:原则上,列出的目录中没有也不应该有任何其他文件,除了localize.sh.
此外,可能 namelocalize.sh以及调用文件的操作localization是一种不好的方法;如果你认为它不好,请在旁注中批评我。
我的程序返回JSON到stdout它是一个对象operations字段,其中包含操作的列表。每个操作都包含包含字段的id字段,例如:
{
"operations": [
{
"id": "694ef895-793f4631-41103e8-8ab59e66",
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用jq.
如果我在写
jq '.operations | .[] | .id'
Run Code Online (Sandbox Code Playgroud)
它有效,如果我正在编写
jq '.operations | .[].id'
Run Code Online (Sandbox Code Playgroud)
它也有效。
即并列与|此处相同。
但是如果我写
jq '.operations.[].id'
Run Code Online (Sandbox Code Playgroud)
它失败并显示消息
jq:错误:语法错误,意外的“[”,期待 FORMAT 或 QQSTRING_START(Unix shell 引用问题?),第 1 行:.operations.[].id jq:1 编译错误
为什么以及如何解决?
每次我运行新的虚拟终端时,它都会以
\n\nbash: /usr/share/bash-completion/bash_completion: line 226: syntax error near unexpected token `}\'\nbash: /usr/share/bash-completion/bash_completion: line 226: `}\'\nkimifish@kimipc:~$ \nRun Code Online (Sandbox Code Playgroud)\n\n但该文件bash_completion似乎是\xd0\xbek(当然不是)。抱歉那些竖条,这只是 vim 选项卡突出显示:
...\n 186 # Assign variables one scope above the caller\n 187 # Usage: local varname [varname ...] &&\n 188 # _upvars [-v varname value] | [-aN varname [value ...]] ...\n 189 # Available OPTIONS:\n 190 # -aN Assign next N values to varname as array\n 191 # -v Assign single value to varname\n 192 …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个脚本,该脚本将删除充满状态信息和其他各种文本的 txt 文件的某些部分。我无法结束主要的 if 语句。此外,我试图通过将 date 命令放入生成 output.txt 的脚本中来删除最旧的状态信息。有没有办法让它删除最旧的信息。我主要是想让 if 语句结束。谢谢。(另外,我最初将 else if 作为 elif 的,但我得到了相同的结果。)
./count.sh:第 30 行:意外标记附近的语法错误else'
./count.sh: line 30:else'
WCOUNT=$(wc -l output.txt $1 | awk '{print $1}')
if [[ $WCOUNT -gt 50 ]]; then
if [[ "grep CLIENTSTART output.txt" != null ]]; then
echo $WCOUNT
sed -i '/\*\*\*CLIENTSTART/,/CLIENTEND\*\*\*/ d' output.txt
echo $WCOUNT
else if [[ -n "grep DHCPSTART output.txt" ]]; then
echo $WCOUNT
sed -i '/\*\*\*DHCPSTART/,/DHCPEND\*\*\*/ d' output.txt
echo $WCOUNT
else if [[ -n "grep …Run Code Online (Sandbox Code Playgroud) 我有一个 Ansible 手册,用于在远程计算机上建立 LAMP 环境。
本手册的一部分涉及安装 Composer:
- name: Install Composer
get_url:
url: https://getcomposer.org/installer
dest: /tmp/composer-setup.php
command: php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
Run Code Online (Sandbox Code Playgroud)
相反,我考虑ansible-galaxy在剧本中使用以下 5 行结构:
ansible-galaxy install geerlingguy.composer
Run Code Online (Sandbox Code Playgroud)
geerlingguy.composer是最受社区支持的 AG 角色,拥有超过 100 万用户(所以我假设如果出现问题并且 Jeff 目前不在身边 - 比如说,去夏威夷度假或其他什么地方,将会有许多社区成员来解决问题)问题并确保稳定性。
使用这个也会缩短我已经很长的剧本。
一般来说,最好的做法是在 Ansible 剧本中使用 Ansible-Galaxy 角色来执行任务和测试,而不是在剧本中使用一组 ansible 模块,这些模块显然应该实现相同的目标(也许一些多余的额外内容可能不重要并且不会)不要打扰作为 AG 角色的一部分)?我认为是的,因为它更公共、更稳定。
关于在 vim 中打开除 [condition] 之外的所有文件的答案:
https://unix.stackexchange.com/a/149356/98426
给出了类似的答案:
find . \( -name '.?*' -prune \) -o -type f -print
(我修改了答案,因为我在这里的问题与 vim 无关)
其中否定条件位于转义括号中。但是,在我的测试文件中,以下内容
find . -type f -not -name '^.*'
产生相同的结果,但更易于读写。-not 方法与 -prune 方法一样,会修剪任何以 . (点)。我想知道 -not 和 -prune -o -print 方法会产生不同结果的边缘情况是什么。
Findutils 的信息页面如下:
-not expr : 如果 expr 为假则为真
-prune:如果文件是目录,则不下降到其中。(并进一步说明需要 -o -print 才能实际排除顶级匹配目录)
他们似乎很难以这种方式进行比较,因为 -not 是一个测试,而 -prune 是一个动作,但对我来说,它们是可以互换的(只要 -o -print 出现在 -prune 之后)
syntax ×10
bash ×4
shell-script ×3
find ×2
shell ×2
ansible ×1
apache-httpd ×1
autocomplete ×1
command ×1
dot-files ×1
executable ×1
file-search ×1
gnu ×1
jq ×1
json ×1
linux ×1
man ×1
php ×1
rc ×1
scripting ×1
stability ×1
subshell ×1
test ×1
wildcards ×1
zsh ×1