Go to the first, previous, next, last section, table of contents.
Parameter Substitution
In zsh, parameters are set like this:
% foo=bar % echo $foo barSpaces before or after the = are frowned upon:
% foo = bar zsh: command not found: fooAlso,
set
doesn't work for setting parameters:% set foo=bar % set foo = bar % echo $foo %Note that no error message was printed. This is because both of these commands were perfectly valid; the
set
builtin assigns its arguments to the positional parameters ($1
, $2
, etc.).% set foo=bar % echo $1 foo=bar % set foo = bar % echo $3 $2 bar =If you're really intent on using the csh syntax, define a function like this:
% set () { > eval "$1$2$3" > } % set foo = bar % set fuu=brrr % echo $foo $fuu bar brrrBut then, of course you can't use the form of
set
with options, like set -F
(which turns off filename generation). Also, the set
command by itself won't list all the parameters like it should. To get around that you need a case
statement:% set () { > case $1 in > -*|+*|") builtin set $* ;; > *) eval "$1$2$3" ;; > esac > }For the most part, this should make csh users happy.
The following sh-style operators are supported in zsh:
% unset null % echo ${foo-xxx} bar % echo ${null-xxx} xxx % unset null % echo ${null=xxx} xxx % echo $null xxx % echo ${foo=xxx} bar % echo $foo bar % unset null % echo ${null+set} % echo ${foo+set} setAlso, csh-style : modifiers may be appended to a parameter substitution.
% echo $PWD /home/learning/pf/zsh/zsh2.00/src % echo $PWD:h /home/learning/pf/zsh/zsh2.00 % echo $PWD:h:h /home/learning/pf/zsh % echo $PWD:t src % name=foo.c % echo $name foo.c % echo $name:r foo % echo $name:e cThe equivalent constructs in ksh (which are also supported in zsh) are a bit more general and easier to remember. When the shell expands
${foo#pat}
, it checks to see if pat matches a substring at the beginning of the value of foo
. If so, it removes that portion of foo
, using the shortest possible match. With ${foo##pat}
, the longest possible match is removed. ${foo%pat}
and ${foo%%pat}
remove the match from the end. Here are the ksh equivalents of the :modifiers:% echo ${PWD%/*} /home/learning/pf/zsh/zsh2.00 % echo ${PWD%/*/*} /home/learning/pf/zsh % echo ${PWD##*/} src % echo ${name%.*} foo % echo ${name#*.} czsh also has upper/lowercase modifiers:
% xx=Test % echo $xx:u TEST % echo $xx:l testand a substitution modifier:
% echo $name:s/foo/bar/ bar.c % ls foo.c foo.h foo.o foo.pro % for i in foo.*; mv $i $i:s/foo/bar/ % ls bar.c bar.h bar.o bar.proOne possible source of confusion is the fact that in zsh, the result of parameter substitution is not split into words. Thus, this will not work:
% srcs='glob.c exec.c init.c' % ls $srcs glob.c exec.c init.c not foundThis is considered a feature, not a bug. If splitting were done by default, as it is in most other shells, functions like this would not work properly:
$ ll () { ls -F $* } $ ll 'fuu bar' fuu not found bar not found % ll 'fuu bar' fuu bar not foundOf course, a hackish workaround is available in sh (and zsh):
% setopt shwordsplit % ll () { ls -F "$@" } % ll 'fuu bar' fuu bar not foundIf you like the sh behaviour, zsh can accomodate you:
% ls ${=srcs} exec.c glob.c init.c % setopt shwordsplit % ls $srcs exec.c glob.c init.cAnother way to get the
$srcs
trick to work is to use an array:% unset srcs % srcs=( glob.c exec.c init.c ) % ls $srcs exec.c glob.c init.cor an alias:
% alias -g SRCS='exec.c glob.c init.c' % ls SRCS exec.c glob.c init.cAnother option that modifies parameter expansion is
RCEXPANDPARAM
:% echo foo/$srcs foo/glob.c exec.c init.c % setopt rcexpandparam % echo foo/$srcs foo/glob.c foo/exec.c foo/init.c % echo foo/${^srcs} foo/glob.c foo/exec.c foo/init.c % echo foo/$^srcs foo/glob.c foo/exec.c foo/init.c
Go to the first, previous, next, last section, table of contents.
0 件のコメント:
コメントを投稿