hi,
does anyone know how to check if certain character is contained in the argument?

for example: > foo /home/myname

how should I check if the argument contains a "/" character?

thanks

Recommended Answers

All 10 Replies

just use "basename"

Hey There,

You can use expr's colon (:) notation for string comparison, but it might be easier to read and write to do something with grep, like:

echo $1|grep "/" >/dev/null 2>&1

(use -q for Gnu grep and you can avoid the output redirection).

then check errno ($?). If it equals 0, your string has a "/" in it.

Hope that helps,

Mike

Hey There,

You can use expr's colon (:) notation for string comparison, but it might be easier to read and write to do something with grep, like:

echo $1|grep "/" >/dev/null 2>&1

(use -q for Gnu grep and you can avoid the output redirection).

then check errno ($?). If it equals 0, your string has a "/" in it.

Hope that helps,

Mike

thanks, and it definitely helps. I actually figured that out after a while. I have another question if anyone helps out, it would be so great.

say file=/home/admin/foo
and i want to delete the foo and leave file=/home/admin how do i do that?
i tried:
echo $file | tr '/' ' ' | sed 's/ *$//' | tr ' ' '/' #it deleted everything.. : (

can anyone tell how do i delete something in between? all the reference I read only tell the usage of ^ and $ Thanks

first idea is to use "cut" with '/' as delimeter

cut works if I know the exact input path="/home/admin/foo"

but if path is an argument.... then it won't know cut -f what field.

what i need is ...

path="$1"
and if $1 is a directory... say like path="/home/admin/foo"

then i need to remove the file foo from the dir and leave path="/home/admin"

......

Hey THere,

Your initial shot was pretty close. Just change:

file=/home/admin/foo
echo $file | tr '/' ' ' | sed 's/ *$//' | tr ' ' '/'

to

file=/home/admin/foo
echo $file |sed 's/^.*\/\(.*\)$/\1/'

and that should do it :)

-bash-3.2$ echo $file |sed 's/^.*\/\(.*\)$/\1/'
foo

Best wishes,

Mike

Hey THere,

Your initial shot was pretty close. Just change:

to

and that should do it :)

Best wishes,

Mike

Mike,
wow... you are genius! That is really helpful and I had never thought about using the saving to register.

However, i need the dir part of the $path but the last file.
$path=/home/admin/foo
result: $path=/home/admin

thanks for the big hint though, i tried to save the same first part into register 1 and the second part into register 2....... but it returns the whole path...(dont' know ) if possible please fix it.. if i get my result..i'll post it here too

my attempt:

echo $path | sed 's/\(^.*\/\):\(.*\)$/\1/'

#anything wrong??

hey all,
just to echo myself.... instead of banging my head for solution of the sed and tr wutever.. it could be done by just :
path=/home/admin/foo
dirname /home/admin/foo

thanks for everyone tried to help.....

Hey,

I know this is closed, but wanted to follow up since I missed you last time ;) Sorry

To get the basename, with sed, just so you have it for your stockpile, just change your expression:

echo $path | sed 's/\(^.*\/\):\(.*\)$/\1/'

to

echo $path | sed 's/^\(.*\)\/.*$/\1/'
/home/admin

Of course, you're right, basename and dirname are much simpler to use ;)

Cheers,

Mike

Hey,

I know this is closed, but wanted to follow up since I missed you last time ;) Sorry

To get the basename, with sed, just so you have it for your stockpile, just change your expression:

to

Of course, you're right, basename and dirname are much simpler to use ;)

Cheers,

Mike

just wanna thank mike for the follow up.... i was banging my head to get to sed to work until i saw the first post (thank to who posted too)... and i looked it up "basename" (i m pretty new to shell scripting).. and i think there must be something does the opposite of basename... and wooooo!!!... dirname leads the way!!!... thanks again for helping

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.