Linux Bash 脚本,单个命令但多行?

Jay*_*oix 179 linux script bash tar

我通过搜索 Google 编写了以下脚本,它将我的 Linux 系统备份到存档:

#!/bin/bash
# init

DATE=$(date +20%y%m%d)

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/share/Archive /
Run Code Online (Sandbox Code Playgroud)

这有效,但我想知道我是否可以格式化脚本以在多行上显示命令,类似于这样,以便以后轻松编辑:

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz 
--exclude=/proc 
--exclude=/lost+found 
--exclude=/sys 
--exclude=/mnt 
--exclude=/media 
--exclude=/dev 
--exclude=/share/Archive 
/
Run Code Online (Sandbox Code Playgroud)

这样以后阅读和编辑就更容易了。是否可以通过这种方式格式化 Bash 脚本?

ner*_*ler 229

您需要做的就是在每一行的末尾添加“\”,这样就可以了。

所以你的看起来像:

tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz \
    --exclude=/proc \
    --exclude=/lost+found \
    --exclude=/sys \
    --exclude=/mnt \
    --exclude=/media \ 
    --exclude=/dev \
    --exclude=/share/Archive \
    /
Run Code Online (Sandbox Code Playgroud)

一些快捷方式

(基于您对设置 $HOSTNAME 的评论更新)

$HOSTNAME

两个选项来设置:

  1. 设置主机名

    主机名=$(主机名)

  2. 使用命令替换(例如$(command)

    所以它看起来像上面一样。这只是使命令在使用之前运行。

$DATE

另一个避免的变量很容易:

$(hostname)_$(date +%Y%m%d).tar.gz \
Run Code Online (Sandbox Code Playgroud)

$ man date 将有日期选项的格式,上面是 YYYYmmdd

  • [推荐](http://stackoverflow.com/a/4708569/1083697) 使用 `$(command)` 而不是 `\`command\`。 (2认同)

Pau*_*aul 17

使用反斜杠在下一行继续执行命令:

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz \
--exclude=/proc \
--exclude=/lost+found \
--exclude=/sys  \
--exclude=/mnt  \
--exclude=/media  \
--exclude=/dev \
--exclude=/share/Archive \
/
Run Code Online (Sandbox Code Playgroud)


Alt*_*gos 8

相同的命令,但每一行都有注释,将是:

tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz `#first comment` \
    --exclude=/proc `#second comment` \
    --exclude=/lost+found `# and so on...` \
    --exclude=/sys \
    --exclude=/mnt \
    --exclude=/media \ 
    --exclude=/dev \
    --exclude=/share/Archive \
    /
Run Code Online (Sandbox Code Playgroud)


小智 7

你可以在 bash 中使用它

PARAMS=(
    -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz 
    --exclude=`enter code here`/proc 
    --exclude=/lost+found 
    --exclude=/sys 
    --exclude=/mnt
    # this is a comment 
    --exclude=/media 
    --exclude=/dev 
    # --exclude=/something
    --exclude=/share/Archive 
    /
)
tar ${PARAMS[@]}
Run Code Online (Sandbox Code Playgroud)

  • 应该是 `tar "${PARAMS[@]}"`,以便保留带有空格的参数。 (3认同)