TypechoJoeTheme

MetMan's Blog

网站页面
2024-02-02

Shell退出状态和test命令(二)

Shell退出状态和test命令(二)
test命令可执行的命令执行会有退出状态,如果想对文件属性/字符串比较/数值大小关系比较进行测试操作获得退出状态呢?我们可以通过test命令进行以上测试。test命令执行结果是其参数比较的退出状态。基本语法:test 表达式 [ 表达式 ]test命令的等价用法是[ ],一般我们都喜欢后一种用法。几种常用的测试:文件属性测试表达式测试为真-d filefile是目录-e filefile存在-f filefile为一般文件示例:$ test -d TMP $ echo $? 0 $ [ -f foo ] 1字符串测试表达式测试为真-n stringstring是非null-z stringstring是nulls1 = s2字符串s1与s2相同s1 != s2字符串s1与s2不同示例:$ var=hello $ test -n "$var" #字符串非空 $ echo $? 0 $ test -n "$var1" #空字符串 $ echo $? 1 $ test -z "$var1" $ echo $? 0数字比较测...
2024年02月02日
168 阅读
0 评论
2024-02-02

conda指定虚拟环境目录方法

conda指定虚拟环境目录方法
笔者使用的HPC机器分配的HOME目录空间很小,而conda默认创建的虚拟环境及安装的python包会放置在该目录下,比如~/.conda/envs。Python包安装的多了很快会将HOME目录空间用满,因此需要将Python虚拟环境迁移到大空间的工作分区中。下面记录了设置conda虚拟环境目录方法。方法一(不推荐)使用conda create命令的--prefix选项指定包含路径信息的环境名称。$ conda create --prefix=/path/to/your/envName激活环境命令$ conda activate /path/to/your/envName可以看出,这种方法需要使用全路径的环境名称,使用不方便。方法二(推荐)我们可以在~/.condarc配置文件中指定默认环境和包存放目录。$ vi ~/.condarc envs_dirs: - /path/to/new/envs/dir pkgs_dirs: - /path/to/new/pkgs/cache/dir 设置好配置文件后,可以使用conda info查询环境目录是否改变了。$ conda...
2024年02月02日
660 阅读
0 评论
2024-01-11

Shell退出状态和test命令(一)

Shell退出状态和test命令(一)
在介绍Shell的if与case前,应该先了解其Shell退出状态和test命令。因为if/case甚至循环while的条件是否成立是根据执行命令的退出状态来确定的。退出状态就像C语言函数调用必须要有返回值(除了void情况)一样,Shell执行完每一条命令后都会返回一个整数值作为退出状态(exit status)给调用它的程序。这里的Shell命令包括内置Shell命令Shell函数外部命令Shell约定整数值0表示命令执行成功,其它非0表示失败。可以使用内置变量$?查询上一个命令退出状态。$ ls test.F90 test.F90 $ echo $? 0 $ echo foo ls: cannot access 'foo': No such file or directory $ echo $? 2 $ echo $? # 此时查询的是上一个echo命令的退出状态 0 我们可以写一个简单的C程序,main函数返回值10,看程序退出状态是否和函数返回值相同。// shell_exit_status.c #include <stdio.h> int m...
2024年01月11日
182 阅读
0 评论
2024-01-11

Shell算术运算

Shell算术运算
本文介绍shell编程时需要用到的整数算术和浮点运算。整数运算shell整数运算有多种实现方法。使用 expr 命令expr 表达式示例:r1=`expr 3 + 4` # 操作数和操作符之间使用空格隔开 r2=`expr 3 - 4` r3=`expr 3 \* 4` # 乘法操作符需要使用\* r4=`expr 3 / 4` # 整数除 r5=`expr 3 % 5` # 整数取余expr没有幂操作。expr表达式中使用shell变量:sum=`expr $r1 + $r2 + $r3 + $r4 + $r5`使用算术展开((表达式))算术展开表达式的操作数和操作符之间不要求空格分隔。前面示例等价于r1=$((3+4)) r2=$((3-4)) r3=$((3*4)) r4=$((3/4)) r5=$((3%4)) r6=$((3**4)) # 增加幂操作算术展开表达式中可以使用shell变量(不用加$):sum=$((r1+r2+r3+r4+r5))注:如果变量未定义,会默认其值为0,不会报错。使用$[ ]前面示例等价于r1=$[3+4] r2=$[3 - 4] r...
2024年01月11日
174 阅读
0 评论
2024-01-01

M-BM-特殊字符问题

M-BM-特殊字符问题
如果你想亲手执行前面文章中一些代码示例,比如下面这段shell脚本,你用鼠标复制代码将内容粘贴到(Linux)一个文件中:#!/bin/bash myfunc() {     echo 'function arg[0]=' $0     echo 'function arg[1]=' $1     echo 'function arg[2]=' $2 } echo 'script arg[0]=' $0 echo 'script arg[1]=' $1 echo 'script arg[2]=' $2 type myfunc #使用type命令查看myfunc类型 myfunc func1 func2保存该脚本(设置可执行权限)并执行。$ ./test_func.sh hi you script arg[0]= ./test_func.sh script arg[1]= hi script arg[2]= you myfunc is a function myfunc () {     echo 'function arg[0]=' $0;     ec...
2024年01月01日
338 阅读
0 评论
2023-12-10

Shell函数语法

Shell函数语法
shell函数通过组合命令来实现特定目的及代码复用。函数定义函数定义两种写法:#第一种写法 func_name () {    cmds } #第二种写法 function func_name [()] {    cmds }不加function关键字的函数定义可移植性更好。函数必须在使用之前定义,一般在脚本开始出定义或者放在独立的脚本中用点号( . )来source引用它(这有点像其它语言include包含头文件处理)。函数调用函数调用方式与执行shell命令相同,需要提供函数名称和对应参数,参数不需要使用括号括起来。myfunc 10 true 需要注意的是,在函数体内位置参数($1 $2 ... $# $@ $*)都是该函数的参数。父脚本参数暂时被函数参数掩盖。 但$0依旧是父脚本的名称。当函数完成时,原来命令行参数会恢复。#!/bin/bash myfunc() {     echo 'function arg[0]=' $0     echo 'function arg[1]=' $1     echo 'function arg[2]=' $2 } echo ...
2023年12月10日
180 阅读
0 评论
2023-12-08

Shell单词分割引起的问题

Shell单词分割引起的问题
前文介绍shell几种展开,其中单词分割展开容易引起意想不到的问题。我们来看两个例子加深下理解。示例1前文提到的脚本示例:#!/bin/bash num_files=0 for file in ~/sample/*.txt do echo $file num_files=$((num_files + 1)) done echo num of files is $num_files我们使用echo $file打印出每个文件名,这里的$file没有加上双引号,会进行单词分割展开,如果只是单纯打印到屏幕,问题不大。但假如我们需要对每个文件进行处理,比如将每个文件内容追加到同一个文件total.txt里:#!/bin/bash > total.txt for file in ~/sample/*.txt do echo $file cat $file >> total.txt done脚本执行信息:/home/user/sample/a.txt /home/user/sample/b c.txt cat: /home/user/sam...
2023年12月08日
181 阅读
0 评论
2023-12-03

Shell expansion学习

Shell expansion学习
Bash在执行输入的命令前,会对输入的字符进行处理,这个过程叫(字符)展开。我们可以通过shell命令echo查看展开过程。$ echo this is a test this is a test #a与test之间只保留了一个空格 $ echo * Desktop LauncherFolder MyDocumentsshell命令在执行前将*展开成了其它东西。shell展开类型下面通过简单的例子来学习shell命令展开。比如一个常见的需求:打印出指定目录中每一个文件用于后续处理。$ cd ~/sample #其中'b c.txt'文件名有空格 a.txt 'b c.txt' d.txt下面是示例脚本:#!/bin/bash num_files=0 for file in `ls ~/sample/*.txt` do echo $file num_files=$((num_files + 1)) done echo num of files is $num_files波浪线展开~/sample/*.txtTilde expansion...
2023年12月03日
169 阅读
0 评论
登录
X
用户名
密码