Csh的使用

本文详细介绍了Csh Shell的基本语法和常用操作,包括变量、数组、命令替换、命令行参数、文件名扩展、IO重定向、条件语句、历史命令、环境变量设置、中断处理和历史命令查看等,旨在帮助开发者熟练掌握Csh Shell的使用。
在*unix系统中,常用的shell有sh,bash,csh/tcsh, ksh.
sh来自于systemV的Unix,是传统的Unix的shell,直到现在很多的系统管理员仍然喜欢使用sh。
bash来自于BSD Unix,语法非常类似于C语言,所以通常有C/C++编程背景的开发人员最喜欢使用。
ksh是对sh的扩展,且吸收了csh的一些有用的功能,但是由于开始ksh的license是AT&T,所以后来出现了很多的ksh的开源版本,例如mksh,pdksh等。
bash是现在很多Linux的发行版中默认的shell,综合了其他shell的很多优点。

下面描述csh的一些基本的语法(在sh环境中执行csh切换到csh环境):

1) 变量
通过set来定义局部变量x,通过$x或${x}来使用变量x的值,$%x表示变量的值的长度, $?x来判断变量x是否设置,如设置则为1,否则为0。
set x = 5
echo $x
echo ${x}kg
echo $%x

全局变量的定义setenv v value 该变量将被此shell派生的所有子shell继承。

$$表示当前进程的PID, $status 或 $? 表示退出状态。

2)数组
定义数组myarr, 通过$myarr[index]来访问数组中的值,注意index是从1开始的。通过$myarr或$myarr[*]来访问数组所有的元素。通过$#myarr来查看元素的个数。
set myarr = (str1, str2,str3)
echo $myarr[2]
echo $myarr
echo $myarr[*]

3)命令替换
通过set x = `cmd`来执行命令,且结果赋值给变量。
set d = `date`
echo $d
echo $d[6]-$d[2]-$d[3]

4)命令行参数
通过$argv[1],$argv[2]或$1,$2来访问命令行参数。命令行参数的个数为$#argv。

5)文件名扩展的元字符
只能使用?,*,[abc],[a-c]。

6)IO重定向和管道
将命令的输出重定向到文件为>。
将命令的输出重定向并追加到文件为>>。
将命令的输入重定向到文件为<。
将命令的报错信息重定向到一个文件(cmd>/dev/tty)>&errors。

将命令的输出和错误输出分别重定向(cmd > goodstuff) >& badstuff。

将命令的输出和报错信息重定向到一个文件cmd>&file。
将命令的输出经管道发往另一个命令cmd|cmd.
将命令的输出和报错信息经管道发往另一个命令cmd|&cmd。
条件语句为 cmd && cmd 或 cmd || cmd。

command<<WORD 表示将command的输入重定向为从第一个WORD处开始,到下一个WORD处之间的内容(即here文档)。

7)从键盘读取并保存到变量中
set var = $<

8)算术
@ var = 5 + 5
echo $var
@ v2 = $var + 3
echo $v2

9)代字符号扩展
~username 表示username的home目录。

10)别名
alias m more 为more创建别名m。
alias 列出所有的alias。
unalias m 用来删除more的alias定义。

11)初始化文件
.login 在登录时执行的文件。
.cshrc 在每次调用shell时都执行的文件。

12) label 和 goto
csh中没有函数的概念,使用类似windows批处理中的label和goto。
goto label
......
label:
....

13) if/else/switch/case
if(expression)then
commands
endif

if {(command)} then
commands
endif

if(expression) then
commands
else if(expression) then
commands
else
commands
endif

switch("$value")
case pattern1:
commands
breaksw
case pattern2:
commands
breaksw
default:
commands
breaksw
endsw

14 while/foreach
while(expression)
commands

continue

break

end
foreach var (wordlist)
commands
end

15 repeat
repeat表示重复执行后面的命令。
repeat 3 "echo helloworld"

16 csh中设置环境变量PATH的方法

csh中使用path代替PATH,设置类似于数组的使用。

set path = ($path /home)

echo $path

echo $PATH

17 source等价于其他shell中的.

source使得程序在当前的shell中被执行,而不是派生子进程来执行。

18转义字符与单双引号

引号必须成对出现,而且必须在同一行上配对。可以用反斜杠来转义换行符,这样就能在下一行配对了。
单引号可用于保护双引号,双引号也可以用来保护单引号。
单引号保护除历史字符(!)之外的所有元字符不被解释。

双引号保护除历史字符(!),变量替换字符($)和反引号(用于命令替换)之外的所有元字符,使其不被解释。

19 历史command

history用来查看command执行的历史。

!!用来执行上一条命令。

20 pushd和popd用来维护目录栈

21 csh -vx用来显示输入的原样和变量替换后的脚本,用来帮助调试。

22在脚本中处理中断

onintr finish
<script continues here>
finish:
onintr - # Disable further interrupts
echo Cleaning temp files
exit 1
onintr 命令后跟一个标号名,finish是用户自定义的标号。如果发生中断,控制将被转移到finish标号。通常该行位于脚本的开头。除非当程序正在执行时按ctrl+C(中断键),此时控制将被转移到该标号。onintr - 表示屏蔽所有的中断,此时按下ctrl+C将会被忽略。

23noclobber 禁止覆盖变量,设定 $noclobber 预设变量改变输出重定向特性.

变量设定语法 set noclobber
取消变量设定语法 unset noclobber
这个 noclobber 变量,它的功能便是停止重定向符号“>”的覆盖(overwiting)已存在文件以及符号“>>”要将字符写入一个不存在的文件时,自动产生该文件的特性。
仅用两个例子让读者明白,设定后的实际使用状况。

例子一:
% ps axu > testfile
% set noclobber
% echo "test set noclobber" > testfile
testfile: File exists.
% echo "test set noclobber" >! testfile
%
例子二:
% set noclobber
% cat /etc/passwd >> nopass
nopass: No such file or directory
% cat /etc/passwd >>! nopass
%
<think>好的,我现在需要帮助用户了解如何在Makefile中指定使用C Shellcsh)。首先,我得确认用户的具体需求是什么。他们可能是在编写Makefile时遇到了问题,或者想要确保Makefile中的命令csh环境下运行。 首先,我应该回忆Makefile的基本结构。Makefile中的每个规则通常由目标、依赖和命令组成,命令默认使用/bin/sh执行。但用户可能希望更改默认的shellcsh,或者在特定命令使用csh的特性。 接下来,我需要考虑几种可能的实现方式。一种方法是在Makefile中全局设置SHELL变量,将其指定为csh的路径。比如SHELL = /bin/csh。不过需要注意,GNU make可能会对SHELL变量有特殊处理,可能需要使用.EXPORT_ALL_VARIABLES或者其他指令来确保生效。 另外,用户可能只需要在某个特定的规则中使用csh,这时候可以在命令前指定SHELL=/bin/csh,或者在命令中直接调用csh -c。例如: target: SHELL=/bin/csh script.csh 或者: target: /bin/csh -c "command" 还需要注意不同make版本之间的差异。例如,GNU make和BSD make在处理SHELL变量时可能有不同行为,可能需要查阅相关文档来确认。如果用户使用的是非GNU make,可能需要不同的方法。 此外,用户可能遇到的问题包括:为什么设置SHELL变量后没有生效,或者命令中的某些csh语法报错。这时候需要检查make的实际使用shell,可以通过在Makefile中添加打印命令,比如: print-shell: @echo "SHELL is set to: $(SHELL)" @echo "Actual shell used is: $$0" 另外,需要注意在Makefile中,命令部分默认使用/bin/sh,因此即使更改了SHELL变量,某些情况下可能需要使用.ONESHELL指令或者在命令中显式调用csh。 总结可能的步骤: 1. 全局设置:在Makefile顶部定义SHELL = /bin/csh,并可能需要导出变量。 2. 单目标设置:在特定目标中临时修改SHELL变量。 3. 显式调用:在命令中直接使用/bin/csh -c来执行脚本。 最后,需要提醒用户测试他们的Makefile修改,确保csh被正确调用,并且注意命令中的语法是否与csh兼容,比如条件语句、循环等可能与bash不同的地方。</think>在Makefile中指定使用C Shellcsh)可通过以下步骤实现: --- ### 方法1:全局设置(适用于所有规则) ```makefile .EXPORT_ALL_VARIABLES: # 确保变量传递给子进程 SHELL = /bin/csh # 强制指定默认Shellcsh your_target: echo "当前Shell: $$shell" # 验证csh环境 # 此处可编写csh语法命令 ``` --- ### 方法2:单目标临时设置(仅针对特定规则) ```makefile specific_target: SHELL=/bin/csh; \ # 临时修改Shell变量 echo "当前Shell: $$shell" ; \ # 其他csh命令需以分号结尾 ``` --- ### 方法3:显式调用csh(推荐兼容性更好) ```makefile explicit_target: /bin/csh -c "echo '当前Shell: $$shell'; ls -l | grep .c" # 直接调用csh解释器 ``` --- ### 关键注意事项: 1. **变量转义** Makefile中`$`需写为`$$`(如访问环境变量时 `$$PATH`) 2. **语法差异** csh的条件语句、循环等语法与bash不同: ```makefile test_if: /bin/csh -c "if (1) then ; echo 'True' ; endif" ``` 3. **验证当前Shell** 通过`echo $$0` 或 `echo $$shell` 确认实际使用Shell 4. **GNU Make兼容性** 部分GNU Make版本会忽略`SHELL`变量,此时优先使用方法3 --- ### 完整示例 ```makefile # 全局设置(可能不兼容所有make版本) .EXPORT_ALL_VARIABLES: SHELL = /bin/csh all: target1 target2 target1: echo "Shell验证: $$shell" # csh语法示例 @foreach file (*.c) echo "处理文件: $$file" end target2: # 显式调用确保兼容性 /bin/csh -c "ls -l *.c | awk '{print \$$9}'" ``` --- 建议优先使用**方法3显式调用**,避免因Make版本差异导致问题。若需全局配置,需测试目标环境是否支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值