我正在运行来自bash的应用程序,就像这样
./app_name var1 var2 $var3
Run Code Online (Sandbox Code Playgroud)
这里var3是--a b, --c d哪里b和d不包含空格.
现在我想添加参数--e f,to $var3,但f包含空格.问题是我试图避免这一行的变化.
./app_name var1 var2 $var3
Run Code Online (Sandbox Code Playgroud)
如果我这样离开它,将app_name两部分理解f为两个不同的参数,因此无法解析.
我可以var3以某种方式改变,以便它不会分裂f成两个不同的args吗?我试过把引号放进去,逃避空间,但没有帮助.
如何获取文件的父目录?
我希望它对所有类型的名称都是安全的:
.
..
path/to/my/file
/absolute/path/to/my/file
'-rf --no-preserve-root whatever'/test.zip
(symbolic links)
`'"`'{(})
Run Code Online (Sandbox Code Playgroud)
我更感兴趣的是获取文件系统上的规范位置,而不是遍历文件名中指定的路径.
请注意,这个问题有类似的问题,但没有一个关注正确性,相对/绝对路径和"不安全"名称:
[1] bash获取当前目录的父目录
[2] 检索脚本的父目录
[3] bash文件路径到文件的父目录
我试图用反引号从Julia里面追加一个文件
run(`cat file2 >> file1`)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.似乎>>运算符无法正确解释.有没有办法用管道或其他技巧来做到这一点?
if [ "$1" = "" ]
then
echo -n "Gib das Startkapital ein: "
read kapital
else
kapital = $1
fi
echo $kapital
Run Code Online (Sandbox Code Playgroud)
当我说kapital = $ 1时它说这个变量不存在:
$ sh zins.sh
zins.sh: 16: zins.sh kapital: not found
Run Code Online (Sandbox Code Playgroud) 我们有一个CI脚本,可以对存储库中的所有Python文件进行样式检查,如下所示:
#!/usr/bin/env bash
find . -name \*.py -exec pep8 --ignore=E402 --max-line-length=120 {} +
if [ $? -ne 0 ]; then
>&2 echo "=== PEP8 errors need to be solved ==="
else
echo "=== PEP8 check ok ==="
fi
pytest
Run Code Online (Sandbox Code Playgroud)
但是,有一些事情要么没有签入,要么被.gitignore编辑.所以我想获取输出git ls-files并仅在那些上运行命令.我可以循环,但我不想对开发人员选择的shell做出假设.理想情况下,我想find通过设置差异来过滤s输出git ls-files.
我确定这一定是一个明显的错误,但我很难过.下面的shell脚本生成一个数据库转储并成功gzip但是aws cli给出了错误:
warning: Skipping file /home/bar/dbsnapshots/foo-12-11-2016.sql.gz/. File does not exist.
我在这个错误中看到了斜杠,但是不明白为什么会显示它或者事实上,aws是否正在寻找一个名为foo-12-11-2016.sql.gz的目录?
ls 按预期显示该文件.
vi /home/bar/dbsnapshots/foo-12-11-2016.sql.gz 成功打开gz文件.
我在路径周围尝试了带有和不带引号的aws命令,同样的错误.我从命令行的shell脚本外部尝试了aws命令,同样的错误.例如
/home/bar/bin/aws s3 sync "/home/bar/dbsnapshots/foo-12-11-2016.sql.gz" s3://foo
AWS CLI由我的用户在/ home/bar/awscli-bundle中的此共享服务器上本地安装并配置,并且能够在S3上创建存储桶.通过AWS浏览器GUI验证.
#!/bin/bash
TODAY=`/bin/date +"%-m-%-d-%Y"`
BU_DIR=/home/bar/dbsnapshots
LOCALFILE=$BU_DIR/foo-${TODAY}.sql
EXCLUDED_TABLES=(
membersBackupV2
transactionReferer
transpages
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
IGNORED_TABLES_STRING+=" --ignore-table=bar_membership.${TABLE}"
done
mysqldump --defaults-extra-file="${BU_DIR}/.my.cnf" --all-databases ${IGNORED_TABLES_STRING} > ${LOCALFILE}
/bin/gzip ${LOCALFILE}
/home/bar/bin/aws s3 sync ${LOCALFILE}.gz s3://foo
Run Code Online (Sandbox Code Playgroud) 我有两个文件,file1.csv
3 1009
7 1012
2 1013
8 1014
Run Code Online (Sandbox Code Playgroud)
和file2.csv
5 1009
3 1010
1 1013
Run Code Online (Sandbox Code Playgroud)
在shell中,我想根据第二列中的标识符,从第一个文件中减去第二个文件中第一列中的计数.如果第二列中缺少标识符,则假定计数为0.
结果将是
-2 1009
-3 1010
7 1012
1 1013
8 1014
Run Code Online (Sandbox Code Playgroud)
文件很大(几GB).第二列已排序.
我如何在shell中有效地做到这一点?
我知道在贝壳中感叹号可以反转条件的结果.在这里,我想用它来测试变量是真还是假.
#! /bin/bash
bat=false
if [ ! $bar ]; then
echo 'bar is false'
else
echo 'bar is true'
fi
Run Code Online (Sandbox Code Playgroud)
我期待'酒吧是假的'.然而事实证明了另一种方式.然后我用"$ bar"=="false".这是正确的.
那么使用感叹号的提示是什么?当我们测试文件时,它只会反转结果吗?
我试着搜索我无法回答我的问题,也许是因为我不确定如何正确地问它,所以我提前道歉.
我试图在bash脚本中执行命令链,例如:
run mysql > type help > exit
root@ubuntu:# mysql
mysql> help
mysql> exit
root@ubuntu:#
Run Code Online (Sandbox Code Playgroud)
我怎样才能在bash脚本中实现这一点?
我试过了操作数||,&& ,; 所有这些,例如:
#!/bin/bash
mysql || help || exit
Run Code Online (Sandbox Code Playgroud)
没工作.它会在彼此之后执行命令.
我有一个由管道分隔的文件,我必须按字段进行分组并获取其出现的总和.
我的输入文件如下:
96472|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
96472|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
96472|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
Run Code Online (Sandbox Code Playgroud)
这就是我这样做的方式:
cut -d'|' -f1 somefile.txt | cut -d'-' -f1 | sort | uniq -c
output is
3 96472
10 214126
Run Code Online (Sandbox Code Playgroud)
基本上我想总结一个字段的出现,就像在sql中的group by子句一样.所以在我的例子中,我显示字段/列1的重复值为3和10
我相信有更好的方法可以做到这一点.而且我还想过滤那些少发生10次的记录:
cut -d'|' -f1 somefile.txt | cut -d'-' -f1 | sort | uniq -c | grep -v 10
Run Code Online (Sandbox Code Playgroud)
是否有很好的方法来实现这两个目标?