http://bash.cyberciti.biz/file-management/shell-script-to-simulate-unix-more-command/
#!/bin/bash
# Write a shell script like a more command. It asks the user name, the
# name of the file on command prompt and displays only the 15 lines of
# the file at a time.
# -------------------------------------------------------------------------
# Copyright (c) 2007 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud) 我试图在bash中声明一个数组,但是当代码运行时它说它找不到数组.我试图用几种不同的方式写出数组的声明,但似乎无论我如何声明它我都无法让它工作.我原本试图这样声明:
candidate[1]= 0
candidate[2]= 0
candidate[3]= 0
Run Code Online (Sandbox Code Playgroud)
返回的错误消息是:
votecalculation.sh: 13: candidate[1]=: not found
votecalculation.sh: 14: candidate[2]=: not found
votecalculation.sh: 15: candidate[3]=: not found
Run Code Online (Sandbox Code Playgroud)
在此之后我尝试了另一种在线发现的解决方案
ARRAY=( 'can1' 'can2' 'can3' )
Run Code Online (Sandbox Code Playgroud)
使用它时会返回此错误:
votecalculation.sh: 12: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)
我是Bash的新手,我对阵列感到很困惑.我需要一些特定的方式来声明一个数组,还是我只是完全错了?
我的简单脚本是这样的:
#!/bin/sh
DEF=.file_name_with_a_leading_dot.sh
. ${DEF}
Run Code Online (Sandbox Code Playgroud)
注意顶行的/ bin/sh.当我运行这个简单的脚本时,我收到一个错误,找不到该文件.但是,如果我将该顶行更改为#!/ bin/bash,则脚本会在当前目录中找到该文件.
但是,在我的Ubuntu linux笔记本电脑上,我看到/ bin/sh是/ bin/bash的符号链接.那么,为什么我的脚本表现不同?
另外,我可以像这样运行脚本:
/bin/bash ./script.sh
Run Code Online (Sandbox Code Playgroud)
没关系.
那么,我错过了什么?
我在使用 bash 脚本时遇到了麻烦。我正在尝试通过 ssh 自动化将文件发送到我的树莓派的过程。我想提示输入文件/目录的路径,然后将其复制到/home/pi/push
我的 pi 上的目录中。然后我想问一下是否还有另一个文件要发送,如果是,则再次循环,否则退出程序。出于明显的安全原因,我将 IP 地址归零。
done=0
while [ $done -lt 1 ]
do
read -r -p "Path to file: " path
spawn scp -r $path pi@000.00.000.00:/home/pi/push
expect "assword:"
send "password\r"
interact
read -r -p "Send another? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
$done=1
else
echo "Ending file transfer."
fi
done
Run Code Online (Sandbox Code Playgroud)
如果您对实现这一目标的更好方法有任何建议,那也太棒了!
我的 .bashrc 中有一个 Bunyan 的别名:
$ alias bsh
alias bsh='bunyan -o short'
Run Code Online (Sandbox Code Playgroud)
此行在 bash 中运行良好:
$ coffee src/index.coffee | bsh
Run Code Online (Sandbox Code Playgroud)
但如果我把同样的东西放在“脚本”中
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"coffee":"coffee src/index.coffee | bsh"
},
Run Code Online (Sandbox Code Playgroud)
并且npm run coffee
,它失败了:
> coffee src/index.coffee | bsh
sh: bsh: command not found
events.js:141
throw er; // Unhandled 'error' event
^
Error: write EPIPE
at exports._errnoException (util.js:870:11)
at WriteWrap.afterWrite (net.js:769:14)
Run Code Online (Sandbox Code Playgroud)
所以我随机尝试放入而||
不是并且|
它起作用了。但我不明白为什么。据我所知,我不必转义 JSON 中的管道字符。
然而,它实际上并不将输出通过管道传输到 bsh 别名。
实际的修复方法是使用 …
我正在阅读 /bin/sh 和 /bin/bash 之间的差异,并遇到了这个有趣的问题/答案:here
我对在我的标题中提出同样问题的答案发表了评论,他回复了更新的答案:
如何找出系统上 /bin/sh 指向的内容?
复杂的是 /bin/sh 可能是符号链接或硬链接。如果它是符号链接,则解决它的可移植方法是:
> % file -h /bin/sh
> /bin/sh: symbolic link to bash
Run Code Online (Sandbox Code Playgroud)
如果是硬链接,请尝试
> % find -L /bin -samefile /bin/sh
> /bin/sh
> /bin/bash
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,但遇到了麻烦,所以我想我应该提出一个单独的问题。
我从链接答案得到的结果:
>file -h /bin/sh
>/bin/sh: executable (RISC System/6000) or object module
>find -L /bin -samefile /bin/sh
>find: bad option -samefile
Run Code Online (Sandbox Code Playgroud)
我缺少什么?我正在运行 AIX:
>oslevel -s
7100-03-03-1415
Run Code Online (Sandbox Code Playgroud) 如何在IPython 魔术命令的末尾添加注释?
例如,尝试使用%cd
:
%cd "dir" # comment
Run Code Online (Sandbox Code Playgroud)
我想更改为目录,dir
但我得到:
Run Code Online (Sandbox Code Playgroud)[Errno 2] No such file or directory: 'dir # comment'
在Centos 6机器上,这适用于:
bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'
Run Code Online (Sandbox Code Playgroud)
这不是:
sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'
Run Code Online (Sandbox Code Playgroud)
我明白了:
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'
Run Code Online (Sandbox Code Playgroud)
没关系grep和tail.问题在于过程替换问题:<(...)
有人可以告诉我这里有什么不同吗?
[编辑]
谢谢你的回答!
使用capistrano进行部署时出现了问题.它默认使用sh,但我现在将其更改为bash.我不能做正常管道的原因是在使用时tail …
我已经看到了其他类似的问题,但我找不到任何关于如何找出通过Crontab运行Bash脚本的正确方法的真实信息.该.sh
文件位于用户目录中(在我的例子中serverpilot
).
该脚本正在尝试复制apps
文件夹的内容并发送到我的S3存储桶.当sh backupS3.sh
从终端运行时脚本运行得很好,但是没有通过Cron的欢乐.我见过人们参考PATH变量等但不知道从哪里开始!
/backupS3.sh
#!/bin/sh
echo 'Started backing to S3'
date +'%a %b %e %H:%M:%S %Z %Y'
aws s3 sync /apps s3://bucketname
date +'%a %b %e %H:%M:%S %Z %Y'
echo 'Finished backing to S3'
Run Code Online (Sandbox Code Playgroud)
crontab中
*/10 * * * * /backupS3.sh >> backupS3.log
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出我做错了什么吗?谢谢!
编辑:我已经在cron命令的末尾添加了2>&1,现在我在日志文件中得到了一些内容:
/bin/sh: 1: /backupS3.sh: not found
我的Jenkins
运行Tomcat
在 user 下运行buildman
,因此所有作业都在该用户(in CentOS
)下运行。我的一些工作取决于我在.bashrc
. 但是,Jenkins 作业看不到该文件中设置的任何变量,即使该脚本应该是为非登录 shell 提供的,例如我认为 Jenkins 应该是(?)。
解决方法很简单:我只是将 .bashrc 中的所有变量复制并粘贴到 Jenkins 的构建命令脚本中。但这不是很优雅。有什么方法可以让 Jenkins 获取它运行的用户的 .bashrc ,以便它获得其通常的配置,而不必在每个作业中单独设置它?
bash ×9
linux ×4
shell ×3
sh ×2
aix ×1
cron ×1
if-statement ×1
ipython ×1
jenkins ×1
json ×1
node.js ×1
ssh ×1
syntax-error ×1
unix ×1
while-loop ×1