标签: syntax

我在一个简单的 Bash 脚本中收到“意外标记‘'$#''附近的语法错误”

我正在使用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)

我已经尝试了围绕 的所有引号(“,',无引号)的组合$#,并且我总是使用我使用的引号类型获得这些错误消息的变体。我无法弄清楚它在寻找什么。

bash syntax

4
推荐指数
3
解决办法
2755
查看次数

是否可以在 /etc/rc.local 中有条件?

内有条件可以/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 标准版。

shell shell-script test rc syntax

4
推荐指数
1
解决办法
558
查看次数

如何使 bash 可以使用 zsh 的 (N) 个模式?

我正在尝试开发一个在 zsh 和 Bash 中运行(并且理想情况下执行相同的操作:-) 的脚本。问题是,在某个时刻,zsh 特定部分包含以 结尾的模式(N)。所以:this_pattern*(N)。在 zsh 中,如果没有匹配项,这会使模式扩展为空。

Bash 对此表示,“意外符号导致语法错误”。请注意,Bash 上的执行永远不会发生在 zsh 特定部分上,并且此错误消息是由解析代码引起的!

我能否以某种方式帮助 Bash 吃掉它,例如不解析它?

scripting bash zsh shell-script syntax

4
推荐指数
1
解决办法
114
查看次数

find 命令的手册页的概要部分是否错误?

所以,当我忘记如何运行某个命令时,我一直试图养成在开始谷歌之前先查看手册页的习惯。

我今天正在查看 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)

shell man find command syntax

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

如何以最小的、干燥的、漂亮的方式在同一目录中执行多个文件?

我使用 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是一种不好的方法;如果你认为它不好,请在旁注中批评我。

executable shell-script wildcards subshell syntax

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

JQ中竖管和并列有什么区别?

我的程序返回JSONstdout它是一个对象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 编译错误

为什么以及如何解决?

json jq syntax

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

意外标记“{”附近存在语法错误

每次我运行新的虚拟终端时,它都会以

\n\n
bash: /usr/share/bash-completion/bash_completion: line 226: syntax error near unexpected token `}\'\nbash: /usr/share/bash-completion/bash_completion: line 226: `}\'\nkimifish@kimipc:~$ \n
Run Code Online (Sandbox Code Playgroud)\n\n

但该文件bash_completion似乎是\xd0\xbek(当然不是)。抱歉那些竖条,这只是 vim 选项卡突出显示

\n\n
     ...\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)

bash autocomplete syntax

2
推荐指数
1
解决办法
3253
查看次数

意外标记“else”附近的语法错误

我正在尝试创建一个脚本,该脚本将删除充满状态信息和其他各种文本的 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)

linux bash syntax

2
推荐指数
1
解决办法
4045
查看次数

在剧本中使用 Ansible-Galaxy 角色而不是在剧本中使用 ansible-modules 是最佳实践吗?

我有一个 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 角色的一部分)?我认为是的,因为它更公共、更稳定。

stability php ansible apache-httpd syntax

2
推荐指数
1
解决办法
503
查看次数

GNU find -not 和 GNU find -prune -o -print 之间的区别

关于在 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 之后)

find gnu dot-files file-search syntax

2
推荐指数
2
解决办法
327
查看次数