标签: bash

Bash 脚本在 if elif 语句上给出“找不到命令”错误

现在,在您将其标记为重复之前,请理解我确实搜索了这个问题,并且我已经尝试了所有解决方案都没有效果。

我的脚本:

#!/bin/bash

echo "Enter the number 3"
read t1
if [$t1 -eq 3]; then
    echo "it is 3"
elif [$t1 > 3]; then
    echo "it is greater than 3"
fi

exit 0
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

./g.sh: line 5: [3: command not found
./g.sh: line 7: [3: command not found
Run Code Online (Sandbox Code Playgroud)

linux bash shell-script

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

在 Linux 中真的没有办法为 cifs/smb 共享上的文件获取创建时间吗?

我在 bash 备份脚本中非常尴尬,并且错过了一些重要的事情。我知道 ext3 文件系统不跟踪创建日期,但是在 ext3 中复制文件会更新通过 stat 看到的更改时间(这会起作用)。但是,当文件从一台 Windows 服务器复制到另一台(我通过 smb/cifs 安装的)时,根据我的测试,更改的时间不会更新。我正在使用 find 对 cifs 共享进行搜索。真的没有办法检测何时使用“查找”从 Linux 通过 cifs 共享创建新文件?

此外,我对 rsync 非常熟悉,在这种情况下,rsync 的限制将其排除在外。我想我可以使用 rsync 进行搜索并尝试将结果通过管道传递给操作 (gzip),但我认为子外壳会很荒谬。当然可能是错的。任何建议将不胜感激。可以提供更多细节,但从我的研究来看,我认为这是不可能的。

linux samba mount bash rsync

6
推荐指数
1
解决办法
7723
查看次数

替换正在运行的 Linux 根文件系统

我正在尝试提出一种 bash 脚本化方法来替换正在运行的 PC 上的根文件系统。该系统使用带有 ext4 rootfs 和交换分区的 MBR 分区磁盘,不幸的是它不使用 LVM / BTRFS 或任何类似的有用的东西。它使用 grub / kernel & initrd / systemd 运行最小的 Debian 发行版。

没有对所讨论的 PC 进行物理访问 - 它正在运行一些自助服务终端软件,可以使用专有工具将包含二进制文件和更新 shell 脚本的 tarball 推送到 PC。我的计划是使用这个更新系统来尝试替换rootfs。

我的想法基本上可以归结为以下几点:

  • 将 initrd 替换为自定义版本,该版本不会将 switch_root 切换到真正的 rootfs 而是替换它(可能使用 dd 写入新映像),然后重新启动到新系统

  • (不知何故!)从实时系统 switch_root 到某种临时文件系统,然后执行上述 dd 并重新启动

  • 如上所述,但是将 init 进程设置为一个新的临时 fs 并执行上述操作或类似操作...

我不熟悉pivot_root 和switch_root 功能,并且目前正在玩-我确定以前已经这样做过,但我已经搜索过但没有找到解决方案!

linux debian bash filesystems partitioning

6
推荐指数
1
解决办法
8255
查看次数

bash 中的 cd <nonexistent_directory> 导致 cd 到不同的目录?

好的,所以我已经使用 Linux 18 年了,从来没有见过或听说过这样的事情:

starting-forth$ ls
ch01/  ch02/  ch04/  ch05/  ch06/  text/
starting-forth$ cd ch07  # A directory I thought I might exist, but didn't
ch04
ch04$
Run Code Online (Sandbox Code Playgroud)

哇?!好的,只是为了确保:

ch04$ pwd
/home/m/learn/forth/starting-forth/ch04
Run Code Online (Sandbox Code Playgroud)

我的 shell 是 bash,在虚拟终端 [LilyTerm,确切地说],在 XFCE 会话中,在 Manjaro Linux 上。我认为我没有进行任何奇怪的自定义,并且整个系统相当新(2014 年 10 月在新笔记本电脑上首次安装)。

那么,任何人都知道是什么导致了这种情况?

更新:我之前没有想到的一个事实(尽管我不知道为什么会如此)是这发生在 Git 工作目录中。

更新 2:显然,只要存在名称相同的现有目录,除了最后一个字符(或两个字符?),作为我尝试 cd 到的不存在目录时,就会发生这种行为。例如:

[tmp]$ mkdir dxx17903
[tmp]$ cd dxx17907
dxx17903
[tmp]$ cd dxx179035
dxx17903
[dxx17903]$ cd ..
[tmp]$ cd dxx179005
bash: cd: dxx179005: No such file or directory
[tmp]$ …
Run Code Online (Sandbox Code Playgroud)

linux bash

6
推荐指数
1
解决办法
411
查看次数

messages.sh:第 29 行:[:缺少`]'

我不知道这是一件坏事,还是意味着什么。我的脚本似乎仍然可以正常工作,但我应该修复它吗?

#!/bin/sh
#This script will send text and maybe images to other computers via ssh and scp.
#Configuration files in same folder

source /Users/jacobgarby/Desktop/messaging/messages.cfg
TIME=$(date +"%H:%M:%S")
CONNECTED[0]="mainmini@192.168.1.65"

if [ -d messages.log ]; then
    :
else
    touch messages.log
fi

read MSG

if [ "$MSG" == "!help" ]; then
    echo ; echo "!clear   Clear's your personal chat log."
    echo "!ban [usrname]    Prevents a user from entering this chat IN DEV."
else
    echo "$TIME | $USER | $MSG" >> messages.log; echo   >> messages.log; …
Run Code Online (Sandbox Code Playgroud)

bash bash-scripting

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

如何同时进行 gzip 和 scp

我有一个文件,我想在其中压缩并同时使用 scp 传输到另一台主机。

我尝试执行以下命令但失败了。我不介意稍后拉上拉链和 scp,但我只想知道我哪里弄错了

使用管道我错了吗?在这里?

-bash-3.2$ gzip -c aum.dmp | scp oracle@192.168.0.191:/export/home/oracle/aum.dmp.gz
Usage: scp [-pqrvBC46] [-F config] [-S program] [-P port]
           [-c cipher] [-i identity] [-o option]
       [[user@]host1:]file1 [...] [[user@]host2:]file2
Run Code Online (Sandbox Code Playgroud)

问候, 菜鸟

centos bash shell ubuntu bash-scripting

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

为什么“exec non-existent-file”在源脚本中退出shell?

的文档exec说,如果当前 shell 是非交互式的并且execfail没有设置选项,它会在出错的情况下退出 shell 。

我注意到交互式 bash shell 中有一个奇怪的行为,但我无法用文档解释。这个命令

exec non-existent-file
Run Code Online (Sandbox Code Playgroud)

产生一条错误消息,并且 shell 保持活动状态,正如预期的那样。但是如果我将相同的命令放入一个文件和source那个文件中,当前的 shell 将被失败的 exec 退出。

有人可以帮助我理解为什么会发生这种情况吗?

bash

6
推荐指数
1
解决办法
468
查看次数

bash - 从函数返回数组并显示内容

经过一些 bash 自学和试验,我坚持从函数返回一个数组,并且我一生都看不到我的错误。

简而言之,这应该/必须做的是使用具有从文件中读取值/字符串的函数,返回一个数组:

  • 声明一个数组:clients
  • 将函数的返回数组分配给数组客户端
  • 显示阵列客户端

在我看来,该函数似乎读取整个文件而不是逐行读取,从而将所有字符串放入数组中的单个单元格中,我不确定如何将 clients[0] 显式显示为 $(clients[0] ]) 在 bash 代码中失败

如果通过某种方式我做错了什么,也请指出这一点或任何关于优化这一点的建议

#!/bin/bash
readArray(){
        local array=()
        local i=0;
        local j=0
        while IFS= read -r LINE  && [[ -n "$LINE" ]] ; do 
                array[$((i++))]+=${LINE}; # Append line to the array
                ((j++))
        done < "$1";
        rtr=${array[@]}
}
string="/home/cybex/openvpntest/openvpn.log"
declare -a clients
#sed -i '/^$/d' $string
clients=$(readArray "$string")
echo "${clients[@]}"

echo -e "array not empty, displaying array contents\n"

for i in "${!clients[@]}"; do 
  echo "$i: ${clients[$i]}"
done
echo -e …
Run Code Online (Sandbox Code Playgroud)

linux bash

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

将 grep 输出保持在一行上?

我有一个非常简单的问题要问你们。在浏览了文档和此处的站点后,我想知道是否可以防止 grep 在同一行上输出每个匹配项。

在我的示例中,我需要采用\xeb\x1a\x5e\x31\xc0\x88\x46\x07...等格式的字符串。我grep -oP "x\K(\S\S)")用来获取每个十六进制数字。

输出是正确的,但是每个匹配项都在自己的行上。这是一个问题,因为我需要将此输出提供给另一个程序。再说一次,有没有办法在没有任何类型的填充的情况下连续放置每个匹配项?

linux bash grep

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

如何从终端绘制标准输入?

我有一堆二进制文件输出如下数据:

-0.002019
-0.000790
0.000158
0.001539
Run Code Online (Sandbox Code Playgroud)

这只是一堆数字,我想在 y 轴上绘制在 x 轴上具有相等间距的数字。

输出实际上有几千行长。

我需要一种简单的方法将它传递给绘制它的东西,如下所示:

./program_dumping_numbers | ??? # a simple window of the plot pops up!
Run Code Online (Sandbox Code Playgroud)

linux bash

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