GVKun编程网logo

UNIX新手:shell脚本没有运行,找不到命令(shell脚本中找不到文件)

16

如果您对UNIX新手:shell脚本没有运行,找不到命令和shell脚本中找不到文件感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解UNIX新手:shell脚本没有运行,找不到命令的各种细节,并

如果您对UNIX新手:shell脚本没有运行,找不到命令shell脚本中找不到文件感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解UNIX新手:shell脚本没有运行,找不到命令的各种细节,并对shell脚本中找不到文件进行深入的分析,此外还有关于20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量、20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量、69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量、bash – Shell脚本没有通过crontab运行,但手动运行正常的实用技巧。

本文目录一览:

UNIX新手:shell脚本没有运行,找不到命令(shell脚本中找不到文件)

UNIX新手:shell脚本没有运行,找不到命令(shell脚本中找不到文件)

我对UNIX编程非常非常陌生(通过terminal在MacOSX Mountain Lion上运行)。 我一直在从生物信息学和分子方法课程(我们有两个类)中学习基础知识,最终将使用perl和python进行数据pipe理。 无论如何,我们的任务是编写一个shell脚本,从一组文件中获取数据,并将其写入一个可以被特定程序(Migrate-N)读取的格式的新文件中。

当我将它们键入到命令行时,我已经获得了许多独立完成所需function的function,但是当我将它们放在脚本中并尝试运行时,出现错误。 这里是细节(我对这个长度表示歉意):

#! /bin/bash grep -f Samples.NFCup.txt locus1.fasta > locus1.NFCup.txt grep -f Samples.NFCup.txt locus2.fasta > locus2.NFCup.txt grep -f Samples.NFCup.txt locus3.fasta > locus3.NFCup.txt grep -f Samples.NFCup.txt locus4.fasta > locus4.NFCup.txt grep -f Samples.NFCup.txt locus5.fasta > locus5.NFCup.txt grep -f Samples.Salmon.txt locus1.fasta > locus1.Salmon.txt grep -f Samples.Salmon.txt locus2.fasta > locus2.Salmon.txt grep -f Samples.Salmon.txt locus3.fasta > locus3.Salmon.txt grep -f Samples.Salmon.txt locus4.fasta > locus4.Salmon.txt grep -f Samples.Salmon.txt locus5.fasta > locus5.Salmon.txt grep -f Samples.Cascades.txt locus1.fasta > locus1.Cascades.txt grep -f Samples.Cascades.txt locus2.fasta > locus2.Cascades.txt grep -f Samples.Cascades.txt locus3.fasta > locus3.Cascades.txt grep -f Samples.Cascades.txt locus4.fasta > locus4.Cascades.txt grep -f Samples.Cascades.txt locus5.fasta > locus5.Cascades.txt echo 3 5 Salex_melanopsis > Smelanopsis.mig echo 656 708 847 1159 779 >> Smelanopsis.mig echo 154 124 120 74 126 NFCup >> Smelanopsis.mig cat locus1.NFCup.txt locus2.NFCup.txt locus3.NFCup.txt locus4.NFCup.txt locus5.NFCup.txt >> Smelanopsis.mig echo 32 30 30 18 38 Salmon River >> Smelanopsis.mig cat locus1.Salmon.txt locus2.Salmon.txt locus3.Salmon.txt locus4.Salmon.txt locus5.Salmon.txt >> Smelanopsis.mig echo 56 52 24 29 48 Cascades >> Smelanopsis.mig cat locus1.Cascades.txt locus2.Cascades.txt locus3.Cascades.txt locus4.Cascades.txt locus5.Cascades.txt >> Smelanopsis.mig

greps系列只是将每个位点的DNA序列数据提取到新的文本文件中。 Samples … txt文件具有站点的示例ID号,.fasta文件具有按样本ID组织的序列信息; 如果我单独运行它,grep在命令行中工作得很好。

第二组代码创build了我需要以.mig结尾的实际新文件。 回波线是程序需要信息的计数数据(每个基因座的碱基对,分析人群,每个站点的样本等)。 猫线将按照由回波线指定的站点特定信息下面的所有格点创build的站点数据将轨迹混合在一起。 你毫无疑问得到的图片。

如何在Shell脚本中检查目录是否为空?

将日志插入项目中的每个函数的脚本?

包装一个可执行文件来诊断它的调用

使用一些Unix命令将每个备用行放在一列中

获取执行脚本的目录的名称

为了创buildshell脚本,我已经在Excel中启动了,所以我可以轻松地复制粘贴/自动填充单元格,保存为制表符分隔的文本,然后在TextWrangler中打开该文本文件,将其保存为.sh文件之前删除标签(Line在与脚本中使用的所有文件相同的目录中打破:Unix(LF)和Encoding:Unicode(UTF-8))。 我已经尝试使用chmod +x FILENAME.sh和chmod u+x FILENAME.sh来尝试确保它是可执行的,但无济于事。 即使我把脚本简化为一个grep行(用#!/ bin / bash第一行),我也无法使它工作。 这个过程只需要一点时间,直接input到命令行中,因为这些文件都不大于160KB,而有些文件却明显更小。 这是我input的内容,当我尝试运行文件时(HW是正确的目录)

localhost:HW Mirel$ MigrateNshell.sh -bash: MigrateNshell.sh: command not found

我已经在这两天了,所以任何input将不胜感激! 谢谢!!

Shell脚本。 命令replace问题在我的脚本

通过脚本检查根完整性

Windows脚本循环

如何在Windows中生成确定大小的文件?

将换行符添加到unix shellvariables

出于安全原因,shell将不会搜索当前目录(默认情况下)可执行文件。 你必须是具体的,并告诉bash你的脚本在当前目录( . )中:

$ ./MigrateNshell.sh

如marc B指出的,将第一行更改为以下内容

#!/bin/bash

然后将脚本标记为可执行文件并从命令行执行

chmod +x MigrateNshell.sh ./MigrateNshell.sh

或者简单地通过传递脚本的命令行来执行bash作为参数

/bin/bash MigrateNshell.sh

确保你没有使用“PATH”作为变量,这将覆盖环境变量的现有路径。

也尝试dos2unix的shell脚本,因为有时它具有Windows行结束和shell不能识别它。

$ dos2unix MigrateNshell.sh

这有时帮助。

关于在剧本的开始部分添加剪贴线有一些好的评论。 我想添加一个建议来使用env命令 ,以增加可移植性。

虽然#!/bin/bash可能是系统上的正确位置,但这不是通用的。 另外,这可能不是用户的首选 bash。 #!/usr/bin/env bash将选择在路径中找到的第一个bash。

#! /bin/bash ^---

删除指定的空间。 该shebang应该是

#!/bin/bash

Unix有一个名为PATH的变量,它是查找命令的目录列表。

$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/david/bin

如果我在命令行键入一个命令foo ,我的shell将首先看看是否有一个可执行的命令/usr/local/bin/foo 。 如果有,它将执行/usr/local/bin/foo 。 如果没有,它会看到是否有一个可执行的命令/usr/bin/foo ,如果不存在,它会查看/bin/foo存在等,直到它到达/Users/david/bin/foo 。

如果在这些目录中找不到foo命令,它会告诉我找不到命令 。

有几种方法可以处理这个问题:

使用命令bash foo因为foo是一个shell脚本。

在执行如/Users/david/foo或$PWD/foo或者只是纯粹的./foo命令时,包括目录名称。

更改$PATH变量,将包含命令的目录添加到PATH。

如果.bash_profile不存在,您可以修改$HOME/.bash_profile或$HOME/.profile 。 我这样做是为了添加/usr/local/bin ,我首先放在我的路径中。 这样,我可以覆盖OS中的标准命令。 例如,我有Ant 1.9.1,但Mac带有Ant 1.8.4。 我把我的ant命令放在/usr/local/bin ,所以我的ant版本会先执行。 我还为我自己的命令添加了$HOME/bin到PATH的末尾。 如果我有一个像你想执行的文件,我会把它放在$ HOME / bin来执行它。

还要确保/ bin / bash是bash的正确位置….如果你从某个地方拿过那行,可能与你的特定服务器不匹配。 如果你为bash指定了一个无效的位置,你将会遇到问题。

在.profile路径中添加以下行

PATH=$PATH:$HOME/bin:$Dir_where_script_exists export PATH

现在你的脚本应该没有./

拉杰·达格拉

尝试chmod u+x MigrateNshell.sh

第一:

chmod 777 ./MigrateNshell.sh

然后:

./MigrateNshell.sh

或者,将您的程序添加到$ PATH变量中的目录中。 示例: 路径变量示例然后允许您在没有./情况下调用程序

20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量

20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量

-20.1shell脚本介绍
-20.2shell脚本结构和执行
-20.3date命令用法
-20.4shell脚本中的变量
#20.1Shell脚本介绍
-shell是一种脚本语言关注aming_linuxblog.lishiming.net
-可以使用逻辑判断、循环等语法
-可以自定义函数
-shell是系统命令的集合
-shell脚本可以实现自动化运维,能大大增加我们的运维效率








#20.2Shell脚本结构和执行
-开头需要加#!/bin/bahs//告诉系统,这个脚本是通过哪一个解释器来进行操作的
-以#开头的行作为解释说明
-脚本的名字以.sh结尾,用于区分这是一一个shell脚本
-先创建一个shell目录
```
[root@aming-01~]#clear
[root@aming-01~]#mkdirshell
[root@aming-01~]#cdshell/
[root@aming-01shell]#ls
[root@aming-01shell]#vi01.sh

#!/bin/bash
echo"123"
w
ls
~

~
:wq
[root@aming-01shell]#vi01.sh
```

-执行方法有两种:
chmod+x1.sh;./1.sh
bash1.sh,sh1.sh
```
[root@aming-01shell]#sh01.sh
123
21:07:19up5min,2users,loadaverage:0.04,0.33,0.20
USERTTYFROMLOGIN@IDLEJcpuPcpuWHAT
roottty121:024:390.02s0.02s-bash
rootpts/0192.168.202.121:037.00s0.03s0.01sw
01.sh
[root@aming-01shell]#
```
-还有一种,文件开头的意思就是意味着接下来的命令是由这个文件来解析的。
```
[root@aming-01shell]#chmoda+x01.sh
[root@aming-01shell]#./01.sh
123
21:09:48up7min,loadaverage:0.14,0.23,0.18
USERTTYFROMLOGIN@IDLEJcpuPcpuWHAT
roottty121:027:080.02s0.02s-bash
rootpts/0192.168.202.121:034.00s0.03s0.00s/bin/bash./01.sh
01.sh
[root@aming-01shell]#
[root@aming-01shell]#cat01.sh
#!/bin/bash
echo"123"
w
ls
[root@aming-01shell]#

```
-bin/bash其实就是bin/sh
```
[root@aming-01shell]#ls-l/bin/bash
-rwxr-xr-x.1rootroot9603928月32016/bin/bash
[root@aming-01shell]#ls-l/bin/sh
lrwxrwxrwx.1rootroot410月522:18/bin/sh->bash
[root@aming-01shell]#

```

-查看脚本执行过程,每个+表示一个步骤
```
[root@aming-01shell]#sh-x01.sh
+echo123
123
+w
21:17:01up14min,loadaverage:0.02,0.07,0.12
USERTTYFROMLOGIN@IDLEJcpuPcpuWHAT
roottty121:0214:210.02s0.02s-bash
rootpts/0192.168.202.121:035.00s0.05s0.00ssh-x01.sh
+ls
01.sh
[root@aming-01shell]#
```
-也可以用sh-n查看脚本的语法是否正确
-没有输出,表示没有错误

```
[root@aming-01shell]#sh-n01.sh
[root@aming-01shell]#
```
-修改一下文件测试一下错误
```
[root@aming-01shell]#sh-n01.sh
[root@aming-01shell]#vi01.sh

#!/bin/bash
echo"123"
w
ls
foriin`seq110`
do
echo$i
~

~
~
:wq

```
-再执行下sh-n看下
```
[root@aming-01shell]#sh-n01.sh
01.sh:行8:语法错误:未预期的文件结尾
[root@aming-01shell]#
```
-改回来
```
[root@aming-01shell]#vi01.sh

#!/bin/bash
echo"123"
w
ls
~
~
~

:wq
```
-再监测就是没用问题
```
[root@aming-01shell]#sh-n01.sh
[root@aming-01shell]#
```







#20.3date命令用法
-date在shell中用处非常大;对文件后缀增加一个时间,以便后期管理
-date+%Y-%m-%d,date+%y-%m-d年月日
```
[root@aming-01~]#date
2017年11月20日星期一22:01:01CST
[root@aming-01~]#
```
-m月,M分钟
```
[root@aming-01~]#date
2017年11月20日星期一22:01:01CST
[root@aming-01~]#date+%Y
2017
[root@aming-01~]#date+%y
17
[root@aming-01~]#date+%m
11
[root@aming-01~]#date+%M
27
[root@aming-01~]#
```
-日期d大D
```
[root@aming-01~]#date+%d
20
[root@aming-01~]#date+%D
11/20/17
[root@aming-01~]#
```
-日期,年月日date+%Y%m%d
```
[root@aming-01~]#date+%Y%m%d
20171120
[root@aming-01~]#
```
-日期date+%F
```
[root@aming-01~]#date+%F
2017-11-20
[root@aming-01~]#
```
-小时,分,秒
-s表示一个时间戳表示距离1970年1月1日0点0分到现在的总共多少秒
```
[root@aming-01~]#date+%H
22
[root@aming-01~]#date+%s
1511188397
[root@aming-01~]#date+%s
22
[root@aming-01~]#date+%s
32
[root@aming-01~]#
```
-关于时间
-date+%T
-date+%H%M%s
```
[root@aming-01~]#date+%T
22:35:38
[root@aming-01~]#date+%H%M%s
223608
[root@aming-01~]#
```
-h显示月份,
```
[root@aming-01~]#date+%h
11月
[root@aming-01~]#
```
-先把语言改成英文
```
[root@aming-01~]#LANG=en
[root@aming-01~]#date+%h
Nov
[root@aming-01~]#
```
-加上冒号date+%H:%M:%s等同于date+%T
```
[root@aming-01~]#date+%H:%M:%s
22:42:38
[root@aming-01~]#date+%T
22:42:42
[root@aming-01~]#
```
-周
-w周几
-W今年的第几周
```
[root@aming-01~]#date+%w
1
[root@aming-01~]#date+%W
47
[root@aming-01~]#
```
-显示日历cal
```
[root@aming-01~]#cal
November2017
SuMoTuWeThFrSa
1234
567891011
12131415161718
19202122232425
2627282930

[root@aming-01~]#
```
-date-d"+1day"+%F一天后
-date-d"-1day"+%F一天前
-date-d"-1month"+%F一个月前
-date-d"-1min"+%F一分钟前

-date-d"-1year"+%F一年前

-标记昨天的日期date-d"-1day"
```
[root@aming-01~]#date
MonNov2023:07:38CST2017
[root@aming-01~]#date-d"-1day"
SunNov1923:07:46CST2017
[root@aming-01~]#
[root@aming-01~]#date-d"-1day"+%F
2017-11-19
[root@aming-01~]#

```
-上个月date-d"-1month"
```
[root@aming-01~]#date-d"-1month"+%F
2017-10-20
[root@aming-01~]#
```
-上一年date-d"-1year"
```
[root@aming-01~]#date-d"-1year"+%F
2016-11-20
[root@aming-01~]#date-d"-1year"
SunNov2023:10:43CST2016
[root@aming-01~]#
```
-上一个小时date-d"-1hour"
```
[root@aming-01~]#date-d"-1hour"+%T
22:11:43
[root@aming-01~]#
```
-时间戳转换成具体的日期时间,也可以现在的时间转换成时间戳
```
[root@aming-01~]#date+%s
1511190759
[root@aming-01~]#

[root@aming-01~]#date-d@1511190759
MonNov2023:12:39CST2017
[root@aming-01~]#
[root@aming-01~]#date+%s-d"2017-11-2023:12:39"
1511190759
[root@aming-01~]#
```








#20.4Shell脚本中的变量
-当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
-使用条件语句时,常使用变量if[$a-gt1];then...;fi
-引用某个命令的结果时,用变量替代n=`wc-l1.txt`
-写和用户交互的脚本时,变量也是必不可少的read-p"Inputanumber:"n;echo$n如果没写这个n,可以直接使用$REPLY
-内置变量$0,$1,$2…$0表示脚本本身,$1第一个参数,$2第二个....$#表示参数个数
-数学运算a=1;b=2;c=$(($a+$b))或者$[$a+$b]

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍

1. shell是一种脚本语言 aming_linux blog.lishiming.net

2. 可以使用逻辑判断、循环等语法

3. 可以自定义函数

4. shell是系统命令的集合

5. shell脚本可以实现自动化运维,能大大增加我们的运维效率

20.2Shell脚本结构和执行

开头(首行)需要加#!/bin/bash

wKioL1m_ckqhE3r9AAAIvtY8MV4555.png

2. #开头行作解释说明

wKiom1m_cpKSIIw8AAAImgijdsU902.png

3. 脚本的名字.sh结尾,用于区分这是一个shell脚本

wKioL1m_cnORagMSAAAKpg-_z8k994.png

4. 执行.sh脚本方法有两种

1) 先给脚本添加x权限[root@hao-01 ~]# chmod +x 1.sh

脚本的绝对路径回车

/root/

wKiom1m_crjQp73IAAAR6B9l73w499.png

2) bash(bash=sh)执行脚本:

bash1.sh

wKiom1m_ctKhnUK4AAANPCm9Z84272.png

5.查看执行过程sh -x 1.sh

wKiom1m_c5uhsOr1AAATS5lJuOo439.png

6.检测是否有语法错误

sh -n1.sh

20.3date命令用法

1. 查看当前时间 date

wKioL1m_cv_hbEcJAAAKEU7XspY974.png

2.

年:

date +%Y

%y

月:

%m

分钟:

%M

日期:

[root@hao-01 ~]# %d

月日年:

%D

年月日

%Y%m%d

年-月-日:

%F

小时:

%H

秒:

%s

时间戳(距离1970年1月1日零点零分到现在有多少秒):

%s

时:分钟:秒:

%H:%M%s

%T

周(星期几):

%w

今年第几周(第几个星期):

%W

显示日历:

cal

前一天(昨天):

date -d "-1 day" +%F

上个月:

-1 month前一年(去年):

-1 years前一小时:

-1 hour前一分钟:

-1 min" +%F


时间戳(当前时间到1970年1月1日零点零分有多少秒):

%s

通过时间戳,翻译成日期时间date -d @1505206911

,转换成date +%s -d "2017-09-12 17:01:51"

wKioL1m_cxuhdcXAAAAwLkDpJ1U561.png

20.4Shell脚本中的变量

当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替

使用条件语句时,常使用变量 if [ $a -gt 1 ]; then ... ; fi

3. 引用某个命令的结果时,用变量替代 n=`wc -l 1.txt`

4. 写和用户交互的脚本时,变量也是必不可少的read -p "Input a number: " n; echo $n 如果没写这个n,可以直接使用$REPLY

5. 内置变量 $0,$1,$2… $0表示脚本本身,$1 第一个参数,$2 第二个 .... $#表示参数个数

6. 数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]

69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量

69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量

1、shell脚本介绍

shell是一种脚本语言和传统的开发语言相比,会比较简单:

shell有自己语法,可以支持逻辑判断、循环等语法:

可以自定义函数,目的是减少重复的代码:

shell是系统命令的集合:

shell脚本可以实现自动化运维,能大大增加我们的运维效率:

2、shell脚本结构和执行

开头需要加#!bin/bash

#号开头注释,解释说明:

脚本需要以.sh结尾,用以区分是shell脚本:

执行的方法有两种:

chmod  +x    1.sh    ;     sh   1.sh

bash   1.sh

查看脚本的执行过程:       sh    -x    1.sh

查看脚本的是否语法错误:   sh     -n    1.sh

3、shell脚本操作

创建一个shell目录,用于写shell脚本:     mkdir      shell     ;    cd   shell

#!bin/bash  第一行必须要这样写,固定的格式,表示在当前机器上用什么命令去执行这个脚本:

[root@localhost_02 shell]# cat 1.sh
#!/bin/bash
echo "123"
w
ls

执行脚本:      sh    1.sh

[root@localhost_02 shell]# sh 1.sh
123
 14:47:01 up  1:28,  1 user,  load average: 0.03, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  13:20    5.00s  0.04s  0.00s w
1.sh  :q!

注释:在当前机器上,不加"#!/bin/bash"也是可以执行的,得到的结果也相同,说明机器可以识别到每一条命令,但是换一台机器就不一定能可以执行。

通常指定"#!/bin/bash"后,接下来要运行的这些命令是通过哪一个解释器来操作的,通常都是/bin/bash这个解释器来执行的,它的作用都在于此:

3:通过给文件一个执行权限:  chmod   a+x  1.sh

执行./1.sh ,说明它的这行命令已经解析,被bin/bash认识了:

[root@localhost_02 shell]# chmod a+x 1.sh
[root@localhost_02 shell]# ./1.sh
123
 14:50:13 up  1:31,  1 user,  load average: 0.01, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  13:20    5.00s  0.05s  0.00s /bin/bash ./1.sh
1.sh  :q!

其实/bin/bash和bin/sh是同一个文件:     连接文件:

[root@localhost_02 shell]# ls -l /bin/bash
-rwxr-xr-x. 1 root root 960472 8月   3 2017 /bin/bash
[root@localhost_02 shell]# ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 5月  31 22:04 /bin/sh -> bash

若没有/bin/sh这个文件:则可以使用/bin/bash这个命令来执行:

[root@localhost_02 shell]# /bin/bash 1.sh
123
 14:53:19 up  1:34,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  13:20    7.00s  0.09s  0.03s w
1.sh  :q!

注释:若以"#"开头的则表示解释说明,在脚本中第二行开始开头的:

脚本一般都是以sh结尾的,用于区分是shell脚本,如若没有,则需要查看这个文件才能知道是shell脚本:

shell有两种执行方式:

1)  sh    1.sh     运行shell脚本:

2)  chmod   a+x    1.sh  先给脚本添加一个执行权限,

然后 ./1.sh 来执行.

      这里的  ./   是一个相对路径的目录,表示当前目录:

      也可以使用绝对路径来执行:       /root/shell/1.sh         #其实就是找到这个文件再执行

[root@localhost_02 shell]# /root/shell/1.sh 
123
 15:04:11 up  1:45,  1 user,  load average: 0.01, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  13:20    3.00s  0.07s  0.01s w
1.sh  :q!

查看脚本的执行过程:    注释:每一个加号,则表示一个操作步骤:

 sh     -x    1.sh        或者          /bin/bash    -x   1.sh     

[root@localhost_02 shell]# sh -x 1.sh
+ echo 123
123
+ w
 15:06:37 up  1:47,  1 user,  load average: 0.02, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.135  13:20    5.00s  0.06s  0.00s sh -x 1.sh
+ ls
1.sh  :q!

查看脚本是否有错误:    注释:若没有错误,则不会有任何的输出:

sh     -n    1.sh

[root@localhost_02 shell]# sh -n 1.sh

2、data 命令语法:   一般用法前面需要"+"号:

%y-%m-%d             ====        年  月  日

%H:%M:%S             ====        小时   分钟    秒

小s表示时间戳:      |       大S表示秒

date   +%Y-%m-%d                                 表示年月日(大Y表示四位的年):

date   +%y-%m-%d                                 表示年月日(小y表示两位的年):

date    +%s                                               表示时间戳:(距离1970年过去了多少秒):

date      -d      @1537515069                 (数字是时间戳显示出来的数字):   显示出来的也是当前日期:

date   -d   "+1 day"                                表示一天前

date   -d   "-1  day"                                表示一天后

date   -d    "+1   month"                       表示一月前

date    -d    "-1   month"                      表示一月后

date    -d    "+1  min"                          表示一分钟前

date    -d    "-1   min"                          表示一分后

date        +%w                                 表示周几

date       +%W                                表示一年的第几周

date语法实践

date  命令,会显示当前的系统的日期和时间:

[root@localhost_02 shell]# date
2018年 09月 21日 星期五 15:39:22 CST

date命令在shell中的作用非常大,一般用于对文件的后缀名增加一个时间:

1:表示年 月 日 date   +%Y-%m-%d                   date   +%y-%m-%d     

[root@localhost_02 shell]# LANG=en_US.UTF-8            #设定字符集:
[root@localhost_02 shell]# date +%Y-%m-%d              #表示年月日,四位的年:            
2018-09-21
[root@localhost_02 shell]# date +%y-%m-%d              #表示年月日,两位的年:
18-09-21
[root@localhost_02 shell]# date +%Y                    #表示四位的年:
2018
[root@localhost_02 shell]# date +%y                    #表示两位的年:
1
[root@localhost_02 shell]# date +%m                    # m 表示月份:
09
[root@localhost_02 shell]# date +%d                    # d 表示日期:
21
[root@localhost_02 shell]# date +%D                    # D 表示一种特殊格式的年月份:
09/21/18
[root@localhost_02 shell]# date +%F                    # 表示年月日的简写:
2018-09-21
[root@localhost_02 shell]# date +%Y%m%d                #表示年月日,不加杆也可以的:
20180921

注释:其实x表示年月日的写法:   data   +%F   ===   date   +%Y-%m-%d   ===   date   +%D(特殊格式)

注释:在表示年月日的时候:默认是用" - "来区分的(如 date  +%F), 不加也是可以的,如上例子:

2:时间单位(小时 分钟 秒   周末)           #默认使用冒号分割:

[root@localhost_02 shell]# date +%T             # T 表示简写的小时  分钟 秒:
15:53:08
[root@localhost_02 shell]# date +%H:%M:%S       #  表示小时 分钟  秒:
15:54:30
[root@localhost_02 shell]# date +%H             # H 表示小时:
15
[root@localhost_02 shell]# date +%M             # M 表示分钟:
55
[root@localhost_02 shell]# date +%S             # S 表示秒:
06
[root@localhost_02 shell]# date +%s             #表示时间戳(距1970年过去了多少秒):
1537516549
[root@localhost_02 shell]# date +%w             # w 表示周几:
5
[root@localhost_02 shell]# date +%W             # W 表示今年的第几周:
38

注释:表示时间的方式:   date   +%T  ===  date   +%H:%M:%S

注释:表示日期的方式:   date   +%F  ===  date   +%Y-%m-%h

3、date还用来标记之前的日期:会用来标记日记(前一天的日期):

year   month   day     hour    min    second    week  (后面的s可加可以不加):

用加减标记(" - "减号标记之前的日期)    (" + "加号标记之后的日期)

day   -1  "-1 year"           #显示上一年的日期:

day   -1  "-1 month"      #显示上一个月的日期:

day   +1  "+1 day"        #显示明天的日期:

day   +1    "+1  hour"     #显示下一个小时的日期:

day   +1    “+1 min”      #显示下一个分钟的日期:

day   +1     "+1 sec"         #显示下一秒的日期: 

[root@localhost_02 shell]# date -d "-1 year"          #显示上一年的日期:
2017年 09月 22日 星期五 07:49:09 CST
[root@localhost_02 shell]# date -d "-1 month"         #显示上一个月的日期:
2018年 08月 22日 星期三 07:49:16 CST
[root@localhost_02 shell]# date -d "-1 day"           #显示昨天的日期:
2018年 09月 21日 星期五 07:49:20 CST
[root@localhost_02 shell]# date -d "+1 hour"          #显示一小时后的日期:
2018年 09月 22日 星期六 08:49:28 CST
[root@localhost_02 shell]# date -d "+1 min"           #显示一分钟后的日期:
2018年 09月 22日 星期六 07:50:32 CST
[root@localhost_02 shell]# date -d "+1 sec"           #显示一秒后的日期:
2018年 09月 22日 星期六 07:49:37 CST
[root@localhost_02 shell]# date -d "+1 week"          #显示一周后的日期:
2018年 09月 29日 星期六 07:49:40 CST

  4、时间戳:      date   +%s                          date   -d    @时间戳

date   +%s   表示显示出时间戳

[root@localhost_02 shell]# date +%s
1537574033
[root@localhost_02 shell]# date -d @1537574033            @后面跟的就是时间戳:
2018年 09月 22日 星期六 07:53:53 CST

注释:若想在linux系统中,把当前日期换算成时间戳,可以使用:  date   +%s   -d"2018-09-22 07:56:53"

[root@localhost_02 shell]# date +%F-%T
2018-09-22-07:56:53
[root@localhost_02 shell]# date +%s -d"2018-09-22 07:56:53"
1537574213

5、在linux下还可以编辑日期:  cal

[root@localhost_01 network-scripts]# cal
      九月 2018     
日 一 二 三 四 五 六
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

3、shell脚本中的变量:

  当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
 使用条件语句时,常使用变量    if [ $a -gt 1 ];   then ...    ;  fi
 引用某个命令的结果时,用变量替代   n=`wc -l 1.txt`
 写和用户交互的脚本时,变量也是必不可少的  read -p "Input a number: " n  ;   echo $n   如果没写这个n,可以直接使用$REPLY
 内置变量 $0, $1, $2…    $0表示脚本本身,$1 第一个参数,$2 第二个 ....        $#表示参数个数
 数学运算 a=1  ; b=2 ; c=$(($a+$b)) 或者$[$a+$b] 

 

 

bash – Shell脚本没有通过crontab运行,但手动运行正常

bash – Shell脚本没有通过crontab运行,但手动运行正常

我有一个脚本检查pptp vpn是否正在运行,如果不是,它重新连接pptp vpn,当我手动运行脚本时它执行正常,当我设置一个cron作业时,没有运行
* * * * * /bin/bash /var/scripts/vpn-check.sh

脚本来了:

#!/bin/sh
/bin/ping -c3 192.168.17.27 > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult="`echo "$result" | sed 's/^\(.................................\).*$$'`"
if [[ $truncresult == "3 packets transmitted,0 received" ]]; then
/usr/sbin/pppd call home
fi
最后我找到了一个解决方案…我需要运行cron而不是
crontab -e

它需要运行

nano /etc/crontab

有类似的东西

*/5 *     * * *   root  /bin/bash /var/scripts/vpn-check.sh

现在很好!

谢谢大家的帮助……希望我的解决方案也能帮助其他人.

关于UNIX新手:shell脚本没有运行,找不到命令shell脚本中找不到文件的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量、20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量、69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量、bash – Shell脚本没有通过crontab运行,但手动运行正常的相关知识,请在本站寻找。

本文标签: